这里发生了很多事情,所以我将零碎地回答。
允许“开发人员”登录管理系统是最好的方法吗?
这取决于您的设置。通常,管理员应该只对“员工”可用:受雇于您的组织或与您的组织直接相关的人。事实上,为了登录管理员,用户必须拥有is_staff=True
. 如果所有用户都属于您的组织(因此可以被认为是“受信任的”),那么是的,允许他们全部访问管理员是可以的。否则,这不是一个好主意,因为您将面临安全风险。
如果是这样,我如何获得一个布尔字段以显示在管理员的用户表单上?
在最简单的意义上,您可以通过将字段添加到表单类中来将字段添加到表单中,即使它是ModelForm
从模型上的字段中预填充其字段的一个字段。
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
is_developer = forms.BooleanField(default=False)
我已将其添加为 userProfile 但不明白如何使其显示在表单上
UserProfile
显然,它是一个不同的模型,因此它的字段在 a 的表单上不可用User
。但是,Django 确实提供了添加/编辑相关模型的能力,这些模型与另一个模型的编辑表单内联。这是通过内联表单集完成的。在管理员中,这些只是称为“内联”。
class UserProfileInlineAdmin(admin.StackedInline):
model = UserProfile
max_num = 1
can_delete = False
class UserAdmin(admin.ModelAdmin):
inlines = [UserProfileInlineAdmin]
但是,您从内联管理员获得的视图明显不同于主表单(在本例中为 of User
)。你可以试试看我的意思。这并不可怕,但它仍然是形式上的明显中断。我之前提到如何向表单添加字段的原因是,如果您愿意,您可以让它看起来像一个表单,但有点巧妙的误导。
class UserAdminForm(forms.ModelForm):
class Meta:
model = User
is_developer = forms.BooleanField(default=False)
def save(self, commit=True):
user = super(UserAdminForm, self).save(commit=commit)
if user.pk:
profile = user.get_profile()
profile.is_developer = self.cleaned_data.get('is_developer')
profile.save()
这是一个简单的示例,但想法是您手动将字段添加到表单中,然后在保存正在编辑的主要对象时使用它们实际手动更新另一个对象。
相关的特别说明User
现在,由于您在User
这里处理,因此有很多棘手的细节。首先,User
已经有了 aUserAdmin
和它自己的形式——是的,复数形式。如果您想添加新功能,您需要确保在此过程中保留现有的 Django 功能。
from django.contrib.auth.admin import UserAdmin
form django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
class CustomUserCreationForm(UserCreationForm):
# do stuff
class CustomUserChangeForm(UserChangeForm):
# do stuff
class CustomUserAdmin(UserAdmin):
form = CustomUserChangeForm
add_form = CustomUserCreationForm
admin.site.unregister(User)
admin.site.register(User, CustomUserAdmin)
此外,UserAdmin
还定义了自己的一组字段集。默认值为:
fieldsets = (
(None, {'fields': ('username', 'password')}),
(_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}),
(_('Permissions'), {'fields': ('is_active', 'is_staff', 'is_superuser', 'user_permissions')}),
(_('Important dates'), {'fields': ('last_login', 'date_joined')}),
(_('Groups'), {'fields': ('groups',)}),
)
add_fieldsets = (
(None, {
'classes': ('wide',),
'fields': ('username', 'password1', 'password2')}
),
)
如果要添加一个或多个字段,则需要重新定义这两个属性,并将字段添加到您想要的位置。