如何在 Django 管理页面中显示外键的属性

Posted

技术标签:

【中文标题】如何在 Django 管理页面中显示外键的属性【英文标题】:How to display an attribute of a foreign key in the Django admin page 【发布时间】: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 的引用,但没有找到关于如何显示该字段的信息。

有人知道怎么做吗?

【问题讨论】:

【参考方案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 中声明该字段。

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

    readonly_fields 中包含方法或其名称。

    在其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)

所以选择框会显示它。

【讨论】:

不错的解决方法,如果没有正确的方法来做我想做的事情,我将不得不采用这种方法。

以上是关于如何在 Django 管理页面中显示外键的属性的主要内容,如果未能解决你的问题,请参考以下文章

如何在Django的同一个表中阻止外键的相同对象引用?

Python:如何在我的 Django 模板中传递外键的值?

如何在不同的数据库中使用带有外键的 django 模型?

如何在Django管理外键过滤器list

如何在 Django html 页面中显示外键数据?

Django 和具有多个外键的模型