如何在 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】:要在ModelAdmin
的fieldset
中显示相关字段,必须首先在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】:最简单的方法是将Category
的level
放入__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 管理页面中显示外键的属性的主要内容,如果未能解决你的问题,请参考以下文章