【问题标题】:How to display an attribute of a foreign key in the Django admin page如何在 Django 管理页面中显示外键的属性
【发布时间】:2011-10-23 22:52:39
【问题描述】:

我想在对象的管理页面上显示与product 相关的category 的级别字段。

    class Category(models.Model):
        name = models.CharField(max_length=50, default=False)
        level = models.IntegerField(help_text="1, 2 ,3 or 4")

    class Product(models.Model):
        category = models.ForeignKey(Category)
        name = models.CharField(max_length=100)


        prepopulated_fields = {'slug': ('name',)}
        fieldsets = [
            ('Product Info',{'fields': ['name', 'slug','partno','description']}),
            ('Categorisation',{'fields': ['brand','category']}),

我找到了对 list_filter 的引用,但没有找到关于如何显示该字段的信息。

有人知道怎么做吗?

【问题讨论】:

    标签: django model django-admin


    【解决方案1】:

    在 ModelAdmin 类上定义一个方法,该方法返回相关字段的值,并将其包含在 list_display 中。

    class ProductAdmin(admin.ModelAdmin):
        list_display = ('name', 'level')
        model = Product
    
        def level(self, obj):
            return obj.category.level
    

    【讨论】:

      【解决方案2】:

      在您的 admin.py 文件中

      class ProductAdmin(admin.ModelAdmin):
          list_display = ('name', 'category__level', 'category')
      
      admin.site.register(Product, ProductAdmin)
      

      试试这个......

      【讨论】:

      • 我试图在产品列表中显示类别级别,而不是在产品索引页面上。此外,除非您尝试添加的项目是可调用的或属性,否则您不能这样做,这很容易用模型方法修复......但不是我想要做的。
      【解决方案3】:

      要在ModelAdminfieldset 中显示相关字段,必须首先在readonly_fields 中声明该字段。

      1. 定义一个返回所需值的方法。

      2. readonly_fields 中包含方法或其名称。

      3. 在其fieldset"fields" 列表中包含方法或其名称。

      from django.contrib import admin
      from .models import MyModel
      
      @admin.register(MyModel)
      class MyModelAdmin(admin.ModelAdmin):
          readonly_fields = ['get_parent_name']  # Don't forget this!
          fieldsets = [('Parent info', {'fields': ['get_parent_name']} )]
          
          @admin.display(description='Parent')
          def get_parent_name(self, obj):
              return obj.parent.name
      

      在“更改”页面上,将有一个包含对象父级名称的“父级信息”部分。

      【讨论】:

        【解决方案4】:

        最简单的方法是将Categorylevel放入__unicode__方法中:

        class Category(models.Model):
            name = models.CharField(max_length=50, default=False)
            level = models.IntegerField(help_text="1, 2 ,3 or 4")
        
            def __unicode__(self):
                return u'%s [%d]' % (self.name, self.level)
        

        所以选择框会显示它。

        【讨论】:

        • 不错的解决方法,如果没有正确的方法来做我想做的事情,我将不得不采用这种方法。
        猜你喜欢
        • 2017-09-01
        • 1970-01-01
        • 2015-07-08
        • 2015-10-04
        • 2013-07-12
        • 2020-12-26
        • 1970-01-01
        • 1970-01-01
        • 2011-01-29
        相关资源
        最近更新 更多