2012-08-02 96 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

相關問題