有很多怎麼回事,所以我打算零碎我的答案。
允許「開發人員」登錄到管理系統的最佳方法嗎?
這取決於您的設置。一般而言,管理員只應對「員工」開放:受僱於或直接與貴組織直接相關的人員。實際上,要登錄管理員,用戶必須有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')}
),
)
如果你想添加一個或多個字段,你就需要重新定義這兩個屬性與字段中添加您想要的地方。
非常感謝您的非常詳細的答覆。我已經使用您描述的方法來處理userprofile字段,並且它運行得非常好。有時讓語言有如此多的控制有點令人不安,這有點讓人不適應,我不太習慣,但我可以清楚地看到它的好處。再次感謝你! :) – Xenocide 2012-08-04 20:46:41
只是一個說明:第2行中的拼寫錯誤,應該是'from'而不是'form' – Tom 2013-08-13 14:16:15