Django auth - 添加用户字段 - 在admin中显示

Xen*_*ide 5 django django-models django-admin django-authentication

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

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

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

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

1)允许"开发者"登录管理系统的最佳方法吗?

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

2)我应该禁止他们登录(到管理面板)并制作"前端",他们只能看到他们被允许的内容吗?

我希望这是有道理的.我现在有点到处都是因为它完全偏离了我以前的习惯!

在此先感谢您提供的任何帮助:)

Chr*_*att 9

这里有很多事情要发生,所以我要简单地回答一下.

允许"开发人员"登录管理系统的最佳方法吗?

这取决于您的设置.通常,管理员应仅对"员工"可用:由您的组织雇佣或直接与您的组织相关的人员.实际上,为了登录管理员,用户必须拥有is_staff=True.如果所有用户都属于您的组织(并且可以被视为"受信任"),那么是的,允许他们全部访问管理员都没关系.否则,这不是一个好主意,因为你正在面对安全风险.

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

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

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel

    is_developer = forms.BooleanField(default=False)
Run Code Online (Sandbox Code Playgroud)

我已将其添加为userProfile但不了解如何在表单上显示它

UserProfile显然是一个不同的模型,所以它的字段不能在表格中提供User.但是,Django确实能够为另一个模型的编辑表单内联添加/编辑相关模型.这是通过内联表单集完成的.在管理员中,这些只是被称为"内联".

class UserProfileInlineAdmin(admin.StackedInline):
    model = UserProfile
    max_num = 1
    can_delete = False

class UserAdmin(admin.ModelAdmin):
    inlines = [UserProfileInlineAdmin]
Run Code Online (Sandbox Code Playgroud)

但是,从内联管理员处获得的视图明显不同于主要表单(在本例中为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()
Run Code Online (Sandbox Code Playgroud)

这是一个简单的例子,但想法是你手动将字段添加到表单,然后使用它们在保存正在编辑的主对象时手动更新其他对象.

特别说明 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)
Run Code Online (Sandbox Code Playgroud)

此外,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')}
    ),
)
Run Code Online (Sandbox Code Playgroud)

如果要添加一个或多个字段,则需要重新定义这两个属性,并在您希望的位置添加字段.