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

byt*_*kie 4 django model django-admin

我想在对象的管理页面中显示产品所属类别的级别.从下面显示的不重要的字段中剪了很多.

    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']}),

Run Code Online (Sandbox Code Playgroud)

显然我已经尝试了一点点工作和google搜索了很多,但我发现了list_filter批次的参考,但没有关于只显示该字段.最好的猜测是

    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']}),

Run Code Online (Sandbox Code Playgroud)

有谁知道这样做的正确方法?

小智 7

ModelAdmin要在a中显示相关字段fieldset,必须首先在 中声明该字段readonly_fields

  1. Define a method that returns the desired value.

  2. Include the method or its name in readonly_fields.

  3. Include the method or its name in its fieldset's "fields" list.

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
Run Code Online (Sandbox Code Playgroud)

On the Change page, there will be a "Parent info" section with the object's parent's name.


Dan*_*man 5

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

class ProductAdmin(admin.ModelAdmin):
    list_display = ('name', 'level')
    model = Product

    def level(self, obj):
        return obj.category.level
Run Code Online (Sandbox Code Playgroud)


rew*_*ten 1

最简单的方法是将 of 放入level方法Category__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)
Run Code Online (Sandbox Code Playgroud)

所以选择框会显示它。