我正在处理我继承的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)
答案 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)