2011-06-13 185 views
1

我已經用「成員」模型擴展了django用戶模型。我希望能夠(在管理員站點上)管理用戶 - 來自兩個模型的所有數據。我需要來自用戶的電子郵件和姓名,但其他所有內容均來自「成員」。我已經設置好了,這樣我就可以在一個表單上獲得所有數據,但是我不能繼續向「成員」添加相關的(子)信息,正如我通常會將它顯示爲內聯模型的用戶一樣。這是我的嘗試。它目前用於顯示用戶+會員,但不能顯示SaleItems(會員)。Django擴展用戶模型,想要擴展模型的額外內聯編輯

from DjangoSite.ManageProducts.models import Member, SaleItem 
from django.contrib import admin 
from django.contrib.auth.admin import UserAdmin 
from django.contrib.auth.admin import User 

# cannot view this data from SaleItem model 
class MemSalesInline(admin.TabularInline): 
    model = SaleItem 
    fk_name = 'Seller' 

class MemberProfileInline(admin.StackedInline): 
    model = Member 
    fk_name = 'user' 
    # this does not work 
    inlines = [ 
       MemSalesInline, 
      ] 

class MyUserAdmin(UserAdmin): 
    inlines = [MemberProfileInline,] 

try: 
    admin.site.unregister(User) 
except admin.sites.NotRegistered: 
    pass 

admin.site.register(User, MyUserAdmin) 

回答

2

有一個偉大的教程,介紹如何做到這一點: http://www.b-list.org/weblog/2006/jun/06/django-tips-extending-user-model/

基本上你可以使用AUTH_PROFILE_MODULE來連接用戶和會員模型。示例代碼調用擴展用戶模型UserProfile,您可能也希望考慮這樣做。

下面是本教程的代碼:

from django.db import models 
from django.contrib.auth.models import User 

class UserProfile(models.Model): 
    url = models.URLField() 
    home_address = models.TextField() 
    phone_numer = models.PhoneNumberField() 
    user = models.ForeignKey(User, unique=True) 

# In Settings.py 

AUTH_PROFILE_MODULE = 'myapp.UserProfile' 

您現在可以訪問您的擴展用戶模型如下:

from django.contrib.auth.models import User 
u = User.objects.get(pk=1) 
user_address = u.get_profile().home_address 

「有一個方法內置的用戶模型稱爲get_profile( ),它將此設置關閉;如果定義了AUTH_PROFILE_MODULE,則在任何用戶上調用get_profile()將從您的自定義類中返回關聯的對象。

+0

謝謝你,這就是我把它設置好的。我現在想管理django管理網站中的User + Member + Member子記錄,但似乎有一些限制。 – user638303 2011-06-13 12:27:43

1

我發現了一個解決方案,我可以通過User.email,user.first_name或user.last_name搜索我的成員,並獲取成員記錄+子記錄 - 如果需要還可以輕鬆返回用戶記錄至。我遇到的問題是我需要能夠通過用戶字段找到我的會員。而不是修改用戶管理站點(django的auth_user),我修改了我的成員管理站點(成員是我的django用戶的擴展)。

admin.py

from DjangoSite.ManageProducts.models import Member, SaleItem 
from django.contrib import admin 

class MemSalesInline(admin.TabularInline): 
    model = SaleItem 
    fk_name = 'Seller' 

class MemberAdmin(admin.ModelAdmin): 
     list_display = ['__str__', 'lname', 'fname'] # fname, lname not sortable 
     raw_id_fields = ("user",) 
     #this allows search "members" by User fields. 
     search_fields = ['user__email', 'user__last_name', 'user__first_name'] 
    # include any child records here - child of "Member" 
    inlines = [MemSalesInline,] 

admin.site.register(Member, MemberAdmin) 

models.py

class Member(models.Model): 
    MemberID = models.AutoField(primary_key=True) 
    Country = models.ForeignKey(dmCountry, blank=True, null=True) 
    # plus more additional member info... 
    # these allow me to view email, last name and first name in the Member admin list page. 
    def __str__(self): 
     return "%s" % self.user.email 
    def lname(self): 
     return "%s" % self.user.last_name 
    def fname(self): 
     return "%s" % self.user.first_name