【问题标题】:Django auth - Adding user fields - displaying in adminDjango auth - 添加用户字段 - 在管理员中显示
【发布时间】:2012-07-31 19:43:02
【问题描述】:

我是 django 和 python 的完整 n00b。我来自 PHP 背景,所以你必须接受我的道歉:p。

我正在尝试使用 django 中的管理面板功能向不同的人显示不同的选项。

系统应允许管理员将“项目”添加到列表中。然后,“开发人员”应该能够仅查看分配给他们的项目,并且只能更改某些字段。

所以我猜这个问题有两个方面:

1) 允许“开发人员”登录管理系统是最好的方法吗?

1.a) 如果是这样,我如何获得一个布尔字段以显示在管理员的用户表单上?我只想标记 is_developer。我已将其添加为 userProfile,但不明白如何使其显示在表单上

2) 我是否应该禁止他们登录(到管理面板)并设置“前端”,让他们只能看到他们被允许的内容?

我希望这是有道理的。我现在有点不知所措,因为这完全背离了我的习惯!

提前感谢您提供的任何帮助:)

【问题讨论】:

    标签: django django-models django-admin django-authentication


    【解决方案1】:

    这里发生了很多事情,所以我将零碎回答。

    允许“开发者”登录管理系统是最好的方法吗?

    这取决于您的设置。通常,管理员应该只对“员工”可用:受雇于您的组织或与您的组织直接相关的人。事实上,为了登录管理员,用户必须拥有is_staff=True。如果所有用户都属于您的组织(因此可以被认为是“受信任的”),那么是的,允许他们全部访问管理员是可以的。否则,这不是一个好主意,因为您将面临安全风险。

    如果是这样,我如何获得一个布尔字段以显示在管理员的用户表单上?

    在最简单的意义上,您可以通过将字段添加到表单类中来将字段添加到表单中,即使它是一个 ModelForm,它会从模型上的字段中预填充其字段。

    class MyModelForm(forms.ModelForm):
        class Meta:
            model = MyModel
    
        is_developer = forms.BooleanField(default=False)
    

    我已将其添加为 userProfile,但不明白如何使其显示在表单上

    UserProfile 显然是一个不同的模型,因此它的字段在User 的表单上不可用。但是,Django 确实提供了添加/编辑相关模型的能力,这些模型与另一个模型的编辑表单内联。这是通过内联表单集完成的。在管理员中,这些只是称为“内联”。

    class UserProfileInlineAdmin(admin.StackedInline):
        model = UserProfile
        max_num = 1
        can_delete = False
    
    class UserAdmin(admin.ModelAdmin):
        inlines = [UserProfileInlineAdmin]
    

    不过,您从内联管理员那里获得的视图明显不同于主表单(在本例中为 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 已经有一个UserAdmin 和它自己的形式——是的复数形式。如果您想添加新功能,您需要确保在此过程中保留现有的 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')}
        ),
    )
    

    如果您想添加一个或多个字段,您需要重新定义这两个属性,并将您的字段添加到您想要的位置。

    【讨论】:

    • 非常感谢您非常详细的回复。我已经使用您描述的方法使 userprofile 字段正常工作,并且运行良好。有时让语言受到如此多的控制有点令人不安,而且有点放手,我不太习惯,但我可以清楚地看到好处。再次感谢你! :)
    • 请注意:第 2 行中的错字应为 from 而不是 form
    猜你喜欢
    • 1970-01-01
    • 2014-05-08
    • 2019-08-12
    • 2016-06-20
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    • 2014-12-01
    • 2013-04-15
    相关资源
    最近更新 更多