【问题标题】:Django Admin: How to display value of fields with list_display from two models which are in oneToOne relation?Django Admin:如何在 oneToOne 关系中的两个模型中显示带有 list_display 的字段值?
【发布时间】:2012-12-29 00:27:29
【问题描述】:

我相信我的问题的答案很简单,但我在任何地方都找不到。这是我的困境。我有两个模型:Member 和 MemberDetail,它们是这样的 oneToOne 关系:

class Member(models.Model):
   ID = models.AutoField(primary_key=True)
   FIRST_NAME = models.CharField('First name', max_length=50)
   LAST_NAME = models.CharField('Last name', max_length=50)
   def __unicode__(self):  
      return u'%s %s' % (self.FIRST_NAME, self.LAST_NAME)

class MemberDetail(models.Model):
   member = models.OneToOneField(Member, primary_key=True)
   DATE_OF_BIRTH = models.DateField('Date of birth')
   EMAIL = models.EmailField('E-mail')
   PHONE = models.CharField('Phone', max_length=15)

现在在我的 admin.py 中,我想为成员显示他的所有数据的表格,如下所示:

class MemberDetailInline(admin.TabularInline):
    model = MemberDetail

class MemberAdmin(admin.ModelAdmin):
    list_display = ("FIRST_NAME", "LAST_NAME", "date_of_birth", "email", "phone")
    inlines = [
        MemberDetailInline,
    ]

admin.site.register(Member, MemberAdmin)

我根本不知道如何写 list_display 的“date_of_birth”、“email”和“phone”部分。我能做的最接近的事情是在内联之后添加:

def date_of_birth(self, MemberDetail):
    return MemberDetail.DATE_OF_BIRTH
def date_of_birth(self, MemberDetail):
    return MemberDetail.EMAIL
def date_of_birth(self, MemberDetail):
    return MemberDetail.PHONE

但页面上的字段显示为空。解决办法是什么?谢谢。

【问题讨论】:

    标签: django admin models one-to-one


    【解决方案1】:

    终于!!!我解决了。我认为这很简单,但我不得不用其他方式和多表继承:

    models.py
    class Member(models.Model):
        ID = models.AutoField(primary_key=True)
        FIRST_NAME = models.CharField('First name', max_length=50)
        LAST_NAME = models.CharField('Last name', max_length=50)
    
    # Using multi table inheritance - automaticly creates one to one field
    class MemberDetail(Member):
        DATE_OF_BIRTH = models.DateField('Date of birth')
        EMAIL = models.EmailField('E-mail')
        PHONE = models.CharField('Phone', max_length=15)
    

    现在是 admin.py

    admin.py
    class MemberDetailAdmin(admin.ModelAdmin):
        list_display = ("FIRST_NAME", "LAST_NAME", "DATE_OF_BIRTH", "EMAIL", "PHONE")
    
    admin.site.register(MemberDetail, MemberDetailAdmin)
    

    就是这样。也许,还有其他解决方案,但这对我有好处。

    【讨论】:

      【解决方案2】:

      如果有人偶然发现这个问题/问题,我不知道从 OneToOne 关系访问字段的直接方法,但是,我能够使用以下 sn-p 解决问题。请注意,我可以通过使用两个“_”访问 OneToOne 的字段来访问 list_filter 中的 OneToOne 字段,例如:modelB_fieldOne

      @admin.display(description='Date')
          def transaction_date(self, purchase):
              return purchase.transaction.date
      
      list_display = ('product', 'transaction_date')
      list_filter = ('product', 'transaction__date')
      
      

      【讨论】:

        【解决方案3】:

        你应该可以在list_display中做'member_detail__email'

        因为它是 1-1,所以你应该有一个 backref,并且使用两个下划线引用相关的字段。

        【讨论】:

        • 感谢重播。我对“member_detail__email”部分感到困惑。我试过了,但是如果我把它 Django 报告错误,它不是可调用的,也不是'MemberAdmin'的属性,也不是在模型'Member'中找到的。我发现了一些看起来像解决方案的代码。它类似于 Member.objects.get(),但我不知道如何完成它。
        • 你有什么选择?通常它会给你一个列表。
        • 又一个死胡同。说要获取的值太多或类似的东西。我喜欢你的 backref 想法,但只是不明白如何编写它。我希望解决方案优雅,例如:Member__MemberDetail__EMAIL。但是如果它超出了“”错误,并且如果它在“”错误之内。也许我错过了一些东西。关键是Member 没有注册MemberDetail。它在管理员上添加表单或更改表单。但在 list_display 中,我无法从 MemberDetail 中显示这些字段。
        • “值太多”...?我的意思是,当它给你“不是可调用或属性”错误时,它通常会继续说“可用字段是 ”是这样做的吗?
        • 抱歉造成误会。但是不,没有这样的消息。
        猜你喜欢
        • 1970-01-01
        • 2014-12-28
        • 1970-01-01
        • 2020-02-14
        • 1970-01-01
        • 2013-03-07
        • 1970-01-01
        • 2017-06-08
        • 2013-08-28
        相关资源
        最近更新 更多