2010-08-03 74 views
19

如果您想在Django中存儲有關用戶(django.contrib.auth.models.User)的額外信息,您可以使用漂亮的AUTH_PROFILE_MODULE插入「配置文件」模型。每個用戶然後獲取配置文件。這一切都說明如下:如何在管理界面中編輯django用戶配置文件?

現在,讓我們說我創建了一個稱爲賬戶被稱爲用戶配置模型的應用程序並將其註冊爲我的用戶配置文件的模型。 如何在管理界面中編輯配置文件以編輯用戶(反之亦然)?

回答

13

嗯,事實證明,這很容易,一旦你知道如何做到這一點。這是我的myapp /帳號/ admin.py:

from django.contrib import admin 
from myapp.accounts.models import UserProfile 
from django.contrib.auth.models import User 

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

class AccountsUserAdmin(admin.UserAdmin): 
    inlines = [UserProfileInline] 

# unregister old user admin 
admin.site.unregister(User) 
# register new user admin that includes a UserProfile 
admin.site.register(User, AccountsUserAdmin) 

用戶的默認admin.UserAdmin的ModelAdmin類是未登記的和新的指定在線UserProfile在其地方註冊。只是想我應該分享。

+1

你是如何處理密碼錶單鏈接的?只是這些更改打破了它,因爲只有在添加了名稱和密碼的用戶後才能從更改表單中看到這些更改。 – JivanAmara 2011-01-17 06:13:15

+2

以上幾乎是正確的,'密碼錶單鏈接'的正確方法是擴展自定義'UserAdmin',而不是使用'admin.ModelAdmin' - 嘗試:'從django.contrib.auth.admin導入UserAdmin'然後'類UserProfileAdmin(UserAdmin):' – 2013-03-14 18:04:23

+0

它很舊,也許過時了。感謝編輯! – 2013-03-14 20:16:12

29

我propseAndré的解決方案的一個略微改進版,因爲它打破了/管理/認證/用戶列表視圖/:

from django.contrib import admin 
from member.models import UserProfile 
from django.contrib.auth.models import User 
from django.contrib.auth.admin import UserAdmin as AuthUserAdmin 

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

class UserAdmin(AuthUserAdmin): 
inlines = [UserProfileInline] 

# unregister old user admin 
admin.site.unregister(User) 
# register new user admin 
admin.site.register(User, UserAdmin) 
+1

如何將'UserProfileInline'移動到頂端的任何想法:? – 2012-03-15 15:57:14

+0

此功能已被多次請求,https://code.djangoproject.com/ticket/4848是最古老的一個。它尚未實施。 – 2012-04-06 13:20:42

+0

非常感謝! – 2012-04-07 01:39:26

15

我提出的另一項改進羅伯特的解決方案:

from django.contrib import admin 
from member.models import UserProfile 
from django.contrib.auth.models import User 
from django.contrib.auth.admin import UserAdmin as AuthUserAdmin 

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

class UserAdmin(AuthUserAdmin): 
    def add_view(self, *args, **kwargs): 
     self.inlines = [] 
     return super(UserAdmin, self).add_view(*args, **kwargs) 

    def change_view(self, *args, **kwargs): 
     self.inlines = [UserProfileInline] 
     return super(UserAdmin, self).change_view(*args, **kwargs) 

# unregister old user admin 
admin.site.unregister(User) 
# register new user admin 
admin.site.register(User, UserAdmin) 

如果沒有對UserAdmin進行此更改,自定義UserProfileInline部分將顯示在「添加用戶」屏幕上,該屏幕只需要輸入用戶名和密碼。如果您在保存之前更改了該屏幕上的任何配置文件數據(遠離默認值),則會出現「重複密鑰」數據庫錯誤。

+0

完全解決我的問題在這裏:http://stackoverflow.com/questions/20214362/post-save-user-signal-that-c​​reates-user-profile-is-being-called-twice-causing-du謝謝你!你會認爲這個User/UserProfile的管理員設置將成爲django文檔的一部分。 – chewynougat 2013-11-26 15:11:14

+0

非常感謝!最後我得到這個表現應該哈哈 – 2015-10-04 04:22:04

0

您必須考慮添加和更改表單。另外,當您嘗試創建用戶時,您將得到一個用戶不能爲無錯誤。以下已經過測試並在1.3版本中工作:

class TeamInline(admin.StackedInline): 
    model = Team 
    fk_name = 'user' 
    max_num = 1 
    can_delete = False 

class TeamUserAdmin(UserAdmin): 
    list_display = ('username', 'email', 'company', 'expertise', 'contact_email', 'contact_phone', 'twitter', 'facebook', 'last_login_short', 'options') 
    list_select_related = True 

    def add_view(self, *args, **kwargs): 
    self.inline_instances = [] 
    return super(TeamUserAdmin, self).add_view(*args, **kwargs) 

    def change_view(self, *args, **kwargs): 
    self.inline_instances.append(TeamInline(self.model, self.admin_site)) 
    return super(TeamUserAdmin, self).change_view(*args, **kwargs)