【问题标题】:Django Admin. Display not-model fieldDjango 管理员。显示非模型字段
【发布时间】:2023-04-24 23:12:01
【问题描述】:

django admin 中是否可以显示非模型字段?

例如,我有模型:

class TestModel(models.Model):
     value = models.DecimalField(max_digits=5, decimal_places=2)

在 Django admin 中,我想显示自定义字段 “coefficient 1”,“coefficient 2”不是模型字段,所以我不想将其值保留在数据库中。该系数将用于计算模型的“值”字段。

系数是使用某种算法生成的。 (例如,我们有模型 CoefficientGenerator 来保留其名称和值)。

这个字段是动态生成的,所以我不能在模型体中声明它。但用户必须有 可以在使用 django admin 保存实例之前编辑系数。

我试图覆盖 ModelAdmin 中的 get_fieldsets 方法:

class TestModelAdmin(ModelAdmin):
    def get_fieldsets(self, request, obj=None):
        fieldsets = super(ProductAdmin, self).get_fieldsets(request, obj)
        for c in CoefficientGenerator.objects.all():
            fieldsets[0][1]['fields'].append(c.name)
        return fieldsets

并且还要在我的自定义管理表单中覆盖 init

def __init__():
    ...
    for c in CoefficientGenerator.objects.all():
        field = forms.CharField(required=False, widget=forms.Textarea, label=c.name)
        self.fields[c.name] = field

但这对我不起作用。我得到了错误: 为 TestModel 指定的未知字段 (....)

谢谢。

【问题讨论】:

    标签: python django django-admin


    【解决方案1】:

    我不完全确定您在这里想要什么。但是大概,如果字段值不是要在 admin 中更改,我想您只是想在那里显示它吧?

    在这种情况下,您可以在模型中定义一个方法,例如“name_language()”,然后通过 list_display 显示它:

    list_display = ('field1', 'field2', 'name_language')
    

    【讨论】:

    • 我已经编辑了这个问题,以减少误解。我不能使用字段声明,因为字段是动态生成的。