2011-06-13 142 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