2016-10-07 11 views
0

Я работаю на Django проект, где одна модели (позволяет сказать, документ) имеет следующие поля:Джанго на заказ Разрешения на Authorization

#In models.py 

class Document (models.Model): 
    choice = (('Yes','Yes'), ('No','No')) 
    authorized = models.CharField (max_length=3, choices=choice, default='No') 

Теперь, как обычный пользователь создает объект Document, уполномоченное поле нет. Тем не менее, начальник должен авторизовать то же самое до его фактического утверждения. Теперь, есть ли система разрешений в django, где один пользователь может создать объект, но не разрешать, тогда как другой пользователь - у кого есть разрешение - может разрешить? Если нет, единственный способ сделать это - создать пользовательское поле в пользовательской модели и проверить его каждый раз?

ответ

0

Прежде всего, почему вам необходимо сохранить возможные значения в CharField, а не в BooleanField? Я думаю, вам стоит подумать об изменении на BooleanField.

Вы можете сделать это путем предоставления пользовательских ModelAmin класса в admin.py:

from django.contrib import admin 
from .models import Document 

@admin.register(Document) 
class DocumentModelAdmin(admin.ModelAdmin): 
    def get_form(self, request, obj=None, **kwargs): 
     if not request.user.is_superuser: 
      self.exclude = ['authorized'] 
     return super(DocumentModelAdmin, self).get_form(request, obj, **kwargs) 

Так что теперь на администратора странице Document если это не суперпользователь, пользователь не увидит authorized поле. Вы можете изменить этот код для проверки, если он должен быть конкретным пользователем, или имеет какие-то права, или если пользователь принадлежит к какой-то Group и т.д.

UPDATE

Если вы хотите быть в общих взглядов, вы можете просто передавать разные формы пользователям, в зависимости от их ролей | разрешений | групп (я не знаю, как ваш так называемый старший отличается от остальных пользователей). Таким образом, ответ будет: создать две формы, а затем передать их в шаблоне на основе ваших атрибутов request.user.

+0

Да, мне лучше пойти с BooleanField, мне плохо. Но люди не суперпользователи. И я не хочу, чтобы это использовалось с администратором, но с общими взглядами. Например, кто-то создает счет-фактуру (фактическое название модели - преследование и продажа). Когда-то созданный старший уполномочил его. Все это должно происходить во взглядах, а не через администратора и, конечно, не через суперпользователей. – Sayantan

+0

@Vishes_shell ... Спасибо, помощник. Но проблема, которую я хочу сказать, заключается в том, как я могу помешать одному человеку (которому не разрешено «разрешать» форму) от доступа к нему. Послушайте, я создаю объект A, и кто-то должен его разрешить. Это похоже на рабочий процесс. Теперь, если эта доступность будет обработана путем проверки пользовательского поля request.user.is_permitted_to_authorize, или есть лучший способ? – Sayantan

+0

@SayantanGanguly, что вам в основном нужно сделать, создать определенное разрешение, которое вы бы назначили превосходным пользователям, или создать группу, представляющую превосходных пользователей, и в представлении зависит от 'user.has_perm' или' group_name в user.groups' вас будет отображать одну из двух форм (один с разрешенным полем и один без). И что произойдет там, если вы войдете на страницу в качестве превосходного пользователя, вы увидите форму, включающую «разрешенный» ввод, но если вы не выше, вы даже не знаете, что такое поле существует. –

0

Django имеет потрясающую систему auth. Я не мог понять ваш сценарий. Но вы можете попробовать что-то вроде этого ниже. По умолчанию каждый объект модели поставляется с тремя объектами Permission, такими как (add_document, change_document и delete_document в вашем случае). Если вы хотите получить какое-то пользовательское разрешение, вы можете добавить его в модель Meta-класс следующим образом:

Вы можете добавить эти права на объект пользователя или объект Group.

models.py

class Document (models.Model): 
    ###### 
    class Meta: 
     permissions = (("Can see document dashbaord", "see_document"),) 

и запустить python manage.py migrate создать новый объект Permission с кодовому в "see_document".

Вы можете реализовать права в запросе обрабатываются по мнению, как это:

view.py

from django.contrib.auth.mixins import PermissionRequiredMixin, permission_required 

# For function based view 
@pemission_required('document.see_document') 
def someview(request): 
    ###### 
    pass 

# For class based views 
class SomeView(PermissionRequiredMixin, BaseView): 

    permission_required = 'document.see_document' 

Это может перенаправить пользователя с вне permssion для разрешения отказано страницы. Для получения дополнительной информации пройдите через это https://docs.djangoproject.com/en/1.10/topics/auth/

+0

Спасибо Amar за ваше время. Теперь вы видите, что это полное разрешение на основе модели/объекта. Я хочу, чтобы разрешение было основано на объекте. То есть любой может создать объект. После создания рабочий процесс переместится на старшего, и старший уполномочит его. Другими словами, у меня есть модель (ее покупкаInvoice & salesInvoice), которая может быть создана по ординатам.После создания поля модели Authorized имеет значение False. Пожилым людям необходимо разрешить это. Как это может быть сделано? – Sayantan

+0

Вы можете переопределить метод сохранения модели по умолчанию – Amar