Django扩展了用户模型,需要为扩展模型进行额外的内联编辑

时间:2011-06-13 04:19:19

标签: django inline extend

我使用“会员”模型扩展了django用户模型。我希望能够(在管理站点上)管理用户 - 来自两个模型的所有数据。我需要来自User的电子邮件和姓名,但其他一切都来自“会员”。我已经设置了它以便我可以在一个表单上获取所有数据,但是我无法继续将相关(子)信息添加到“成员”,因为我通常会将其显示为用户的内联模型。这是我尝试这样做的。它目前可以显示User + Member,但不能显示SaleItems(对于成员)。

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 个答案:

答案 0 :(得分:2)

有一个很棒的教程,介绍了如何执行此操作: http://www.b-list.org/weblog/2006/jun/06/django-tips-extending-user-model/

基本上,您可以使用AUTH_PROFILE_MODULE连接您的用户和会员模型。示例代码调用扩展的User模型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()将返回自定义类中的关联对象。”< / p>

答案 1 :(得分: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