如何提供我自己的' clean_is_staff'在UserChangeForm上?

时间:2017-07-20 18:54:31

标签: django validation

我正在处理我继承的django项目,我想在设置' is_staff'时添加验证。用户的属性。我无法弄明白......

我的目标是确保不能给予普通用户(在这种情况下是学生)' is_staff'特权是错误的。这是额外的保护,除了训练现有管理员不要做这件坏事。

该项目使用标准的auth.user,并拥有自己的Profile类。一切正常。学生注册后,他或她有一个User对象和一个Profile对象。员工用户/应该仅由管理员创建,使用标准的“添加新用户”#39;管理界面中的操作。

顺便说一下,这是Django 1.8。

我的想法是添加一个自定义' clean_is_staff()'如果正在编辑的用户在管理员尝试使用' is_staff'保存更改时具有Profile对象,则引发并引发ValidationError设为True。

所以我做了两件事:写了' ValidatingUserChangeForm'作为UserChangeForm的子类,将我的逻辑放入,并编写了“ValidatingUserAdmin'”,以获得ValidatingUserChangeForm的代码路径。

它不工作;我的ValidatingUserAdmin似乎工作正常,但我的ValidatingUserChangeForm被忽略。我确定这是我的错 - 指导欢迎。

我将在此帖子的评论中提供输出。

from change.forms import ValidatingUserChangeForm


class ValidatingUserAdmin(admin.ModelAdmin):

def __init__(self, name='admin', app_name='admin'):
    super(ValidatingUserAdmin, self).__init__(self, name='admin', app_name='admin')

def get_form(self, request, obj=None, **kwargs):
    form = super(ValidatingUserAdmin, self).get_form(request, obj, **kwargs)
    ###logger.debug("ValidatingUserAdmin::get_form(): about to return '{0}'".format(form))
    return form


admin.site.unregister(User)
admin.site.register(User, ValidatingUserAdmin)

并且forms.py:

class ValidatingUserChangeForm(UserChangeForm):
""" 
The goal of overriding Django's UserChangeForm is 
to keep the Application Stats report correct.

I hope this is the way to provide custom 'clean_is_staff()' service.
The rule I want to enforce is that a registered user cannot be
given 'is_staff' permissions.  
""" 

def __init__(self, *args, **kwargs):
  super(ValidatingUserChangeForm, self).__init__(*args, **kwargs)

def clean_is_staff(self):
    value = self.cleaned_data["is_staff"] 
    # do code here to check for a Profile object for this user.
    return value

def get_form(self, request, obj=None, **kwargs):
    form = super(ValidatingUserChangeForm, self).get_form(request, obj, **kwargs)

3 个答案:

答案 0 :(得分:2)

您忘记在class AnnotatedAlert : Alert { public string Color; // I don't know why C# doesn't allow user defined conversions from a base class // so I am creating a conversion constructor instead public AnnotatedAlert(Alert from) { AutoMapper.Mapper.Map(from, this); } static AnnotatedAlert() { AutoMapper.Mapper.CreateMap<Alert, AnnotatedAlert>(); } }; 方法

中添加'self'参数
clean_is_staff

答案 1 :(得分:1)

您需要告诉您的模型管理员类使用您的自定义表单:

class ValidatingUserAdmin(admin.ModelAdmin):
    form = ValidatingUserChangeForm
    ...

admin.site.unregister(User)
admin.site.register(User, ValidatingUserAdmin)

您可以从模型管理类中删除get_form(设置form已足够)并从表单类中删除(表单不需要get_form方法)。

答案 2 :(得分:0)

好像你想要添加自己的新字段&#39; clean_is_staff&#39;在用户模型中。然后继承AbstractUser并覆盖当前的User模型。

<强> views.py

class User(AbstractUser):

        email = models.EmailField(null=True, blank=True)
        mobile = models.BigIntegerField(null=True, unique=True)
        clean_is_staff = models.BooleanField(default=False)
        ...

<强> admin.py

class AccountUserAdmin(UserAdmin):
    fieldsets = UserAdmin.fieldsets + (
        ('Info', {'fields': ('mobile', 'email', 'clean_is_staff',)}),
    )

admin.site.register(User, AccountUserAdmin)