2014-10-30 2 views
2

Пожалуйста, помогите мне. Я застрял в одном месте в своем проекте django, чтобы создавать вопросники учителями. Я реализовал свою собственную модель UserAdmin, и, несмотря на is_staff, поля is_superuser, у меня есть собственное логическое поле is_teacher. При создании нового пользователя, если установлен флажок «is_teacher», я хочу предоставить права этого пользователя для управления всей моделью анкеты, но удалить разрешения для управления MyUser (создание, изменение и удаление пользователей)Django Admin, пользовательское разрешение checkbox

Это все, ве внедрено:

в models.py

class MyUserManager(BaseUserManager): 
    def create_user(self, username, email=None, password=None): 
     if not username: 
      raise ValueError('The given username must be set') 
     email = MyUserManager.normalize_email(email) 
     user = self.model(username=username, email=email, is_staff=True, is_active=True, is_superuser=False, is_teacher=True) 

     user.set_password(password) 
     user.save(using=self._db) 
     return user 

    def create_superuser(self, username, email, password): 
     u = self.create_user(username, email, password) 
     u.is_staff = True 
     u.is_active = True 
     u.is_superuser = True 
     u.is_teacher = True 
     u.save(using=self._db) 
     return u 


class MyUser(AbstractBaseUser): 
    username = models.CharField(max_length=30, unique=True) 
    email = models.EmailField(blank=True) 
    is_active = models.BooleanField(default=True) 
    is_staff = models.BooleanField(default=True) 
    is_superuser = models.BooleanField(default=False) 
    is_teacher = models.BooleanField(default=True) 

    objects = MyUserManager() 

    USERNAME_FIELD = 'username' 
    REQUIRED_FIELDS = ['email'] 

    def get_full_name(self): 
     return self.username 

    def get_short_name(self): 
     return self.username 

    def __unicode__(self): 
     return self.username 

    def has_perm(self, perm, obj=None): 
     return True 

    def has_module_perms(self, module): 
     return True 

в admin.py

class UserCreationForm(forms.ModelForm): 
    """ 
    A form that creates a user, with no privileges, from the given username and 
    password. 
    """ 
    error_messages = { 
     'password_mismatch': "The two password fields didn't match.", 
    } 
    password1 = forms.CharField(label="Password", 
     widget=forms.PasswordInput) 
    password2 = forms.CharField(label="Password confirmation", 
     widget=forms.PasswordInput) 

    class Meta: 
     model = MyUser 
     fields = ("username",) 

    def clean_password2(self): 
     password1 = self.cleaned_data.get("password1") 
     password2 = self.cleaned_data.get("password2") 
     if password1 and password2 and password1 != password2: 
      raise forms.ValidationError(
       self.error_messages['password_mismatch'], 
       code='password_mismatch', 
      ) 
     return password2 

    def save(self, commit=True): 
     user = super(UserCreationForm, self).save(commit=False) 
     user.set_password(self.cleaned_data["password1"]) 
     if commit: 
      user.save() 
     return user 


class UserChangeForm(forms.ModelForm): 
    password = ReadOnlyPasswordHashField(label="Password") 

    class Meta: 
     model = MyUser 
     fields = ('username', 'password', 'email', 'is_active', 'is_staff', 'is_superuser', 'is_teacher') 

    def clean_password(self): 
     # Regardless of what the user provides, return the initial value. 
     # This is done here, rather than on the field, because the 
     # field does not have access to the initial value 
     return self.initial["password"] 


class MyUserAdmin(UserAdmin): 
    form = UserChangeForm 
    add_form = UserCreationForm 

    list_display = ('username', 'email', 'is_teacher') 
    list_filter = ('is_staff', 'is_superuser', 'is_active') 
    fieldsets = (
     (None, {'fields': ('username', 'password')}), 
     ('Personal info', {'fields': ('email',)}), 
     ('Permissions', {'fields': ('is_superuser', 'is_teacher',)}), 
    ) 

    add_fieldsets = (
     (None, { 
      'classes': ('wide',), 
      'fields': ('username', 'email', 'password1', 'password2')} 
     ), 
    ) 


    search_fields = ('username', 'email') 
    ordering = ('username',) 
    filter_horizontal =() 
+1

предлагаю вам создать группу "учителей с разрешениями вам нужно, а затем добавить эту группу всех пользователей, когда их Поле 'is_teacher' получает значение' True' https://docs.djangoproject.com/en/dev/topics/auth/default/#groups – Anentropic

+0

Спасибо за совет, но я не могу этого сделать. Это должно быть сделано следующим образом: superuser создает новую учетную запись, отмечая поле «is_teacher», и все права доступа должны быть добавлены. Я просто не знаю, где разместить эти разрешения и как их кодировать. – Skiben

+0

https://docs.djangoproject.com/ru/dev/topics/auth/default/#topic-authorization – madzohan

ответ

1

Есть два способа вы можете сделать это. Одно вручную добавляет разрешения. Вы должны сделать это в классе MyUserAdmin, переопределив метод сохранения по умолчанию. Что-то вроде этого:

def save_model(self, request, obj, form, change): 
    # ADD THE PERMISSIONS HERE LIKE SO: 

    obj.save() 
    if obj.is_teacher: 
     # This is just an example of a permission you can add 
     obj.user_permissions.add('questionaires_questionire_change', '......') 
    else: 
     # Remove the permissions in case a user was demoted from teacher status 
     obj.user_permissions.remove('questionaires_questionire_change', '......') 

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

Вы можете переопределить has_change_permission, has_add_permission и has_delete_permission для вашей Анкеты и других моделей, которые вам нужны, в их ModelAdmins. Это пример для вашей модели вопросника (только показывает разрешение изменения здесь):

https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.has_change_permission

class QuestionnaireAdmin(admin.ModelAdmin): 
    def has_change_permission(self, request, obj=None): 
     if request.user.is_teacher: 
      return True 
     # If a user is not a teacher, let Django evaluate their specific permissions (a superusuer will always have permission if you do it this way) 
     return super(QuestionnaireAdmin, self).has_change_permission(request, obj=None) 
+1

Большое спасибо! Это работает наконец! – Skiben

Смежные вопросы