Django Admin:未显示在list_display中的字段

时间:2020-01-09 12:16:53

标签: python django

我的项目包含要处理然后进行分类的项目,因此我有两个主要模型:项目和分类,如下所示:

class Item(models.Model):
    seq_prod = models.IntegerField(primary_key=True)
    value = models.DecimalField(decimal_places=4, max_digits=20)

class Classification(models.Model):
    item = models.ForeignKey(Item, db_index=True, on_delete=models.CASCADE)    
    rule = models.ForeignKey(Rule, null=True, blank=True, on_delete=models.CASCADE)
    atribute = models.ForeignKey(Atribute, on_delete=models.CASCADE)
    valid_clas = models.BooleanField(default=True)
    dat_emission = models.DateField()

模型规则和属性对问题并不重要。

至于管理部分,我们有:

class ClassificationInline(admin.TabularInline):
    model = Classification
    list_display = ('rule', 'atribute', 'valid_clas')

@admin.register(Item)
class ItemAdmin(admin.ModelAdmin):
    list_display = ('desc', 'value',)

    inlines = [
        ClassificationInline,
    ]

请注意,在分类模型中我没有指定主键字段,因此Django创建了一个id列。

在ClassificationInline的列表显示中,我们只有“规则”,“属性”和“ valid_clas”,请注意,既没有“ id”也没有“ dat_emission”。但是,Django界面中会显示“ dat_emission”列,而不会显示“ id”列。

不仅应该显示在list_display上指定的字段?如何删除“ dat_emission”?

2 个答案:

答案 0 :(得分:1)

在您的内联课程中使用exclude

class ClassificationInline(admin.TabularInline):
    model = Classification
    exclude = ('valid_clas', 'dat_emission', )

正如我在Django源代码中看到的那样,list_display类没有TabularInline属性,如果我错了,请纠正我。

答案 1 :(得分:0)

由于@weAreStarDust发布了list_display对于Inlines不起作用,因此我需要在排除对象中添加dat_emission。除此之外,还需要以下代码:

def get_readonly_fields(self, request, obj=None):
    result = list(set(
        [field.name for field in self.opts.local_fields] +
        [field.name for field in self.opts.local_many_to_many]
    ))
    result.remove('id')
    result.remove('dat_emission')
    return result

内联的最终代码是:

class ClassificationInline(admin.TabularInline):
    model = Classification
    exclude = ('dat_emission', )
    ordering = ('rule',)

    can_delete = False

    def has_add_permission(self, request):
        return False

    def get_readonly_fields(self, request, obj=None):
        result = list(set(
            [field.name for field in self.opts.local_fields] +
            [field.name for field in self.opts.local_many_to_many]
        ))
        result.remove('id')
        result.remove('dat_emissao')
        return result