2012-08-02 92 views
3

我是一个完整的n00b到Django & python。我来自PHP背景,所以你必须接受我的道歉:p。Django验证 - 添加用户字段 - 在管理中显示

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

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

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

1)为使“开发商”登录到管理系统做的最好的方法是什么?

1.a)如果是这样,我如何得到一个布尔字段显示在管理员的用户表单上?我只想标记is_developer。我已经添加它作为用户配置文件,但不知道如何使其显示在窗体上

2)我是否应该禁止他们登录(到管理面板),并使“前端”,他们只能看到什么他们被允许?

我希望这是有道理的。我现在有点在这个地方,因为它完全背离了我以前的习惯!

预先感谢任何帮助,您可以给我:)

回答

5

有很多怎么回事,所以我打算零碎我的答案。

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

这取决于您的设置。一般而言,管理员只应对“员工”开放:受雇于或直接与贵组织直接相关的人员。实际上,要登录管理员,用户必须有is_staff=True。如果所有用户都属于您的组织(并且可以被视为“可信”),那么可以,允许他们全部访问管理员都可以。否则,这不是一个好主意,因为你开放自己的安全风险。

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

在最简单的意义上说,你可以通过它确实增加了窗体类的字段添加到表单,即使它是一个ModelForm从模型的字段,其预填充其字段。

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

    is_developer = forms.BooleanField(default=False) 

我已经添加它作为一个用户配置,但不知道如何使它显示形式

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() 

这是一个简单的例子,但这个想法是,你手动添加字段(S)的形式,然后用它们实际上手动更新其他对象时正在编辑的主要对象保存。

特别说明有关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')} 
    ), 
) 

如果你想添加一个或多个字段,你就需要重新定义这两个属性与字段中添加您想要的地方。

+0

非常感谢您的非常详细的答复。我已经使用您描述的方法来处理userprofile字段,并且它运行得非常好。有时让语言有如此多的控制有点令人不安,这有点让人不适应,我不太习惯,但我可以清楚地看到它的好处。再次感谢你! :) – Xenocide 2012-08-04 20:46:41

+0

只是一个说明:第2行中的拼写错误,应该是'from'而不是'form' – Tom 2013-08-13 14:16:15

相关问题