在Django的add_form中显示外键属性

时间:2018-10-24 23:41:34

标签: django django-models django-admin field

是否可以在add_form django中显示外键的属性?

例如:

#models.py
class Test(models.Model):
    name = models.CharField(max_length=60, db_column='Name')  # Field name made lowercase.
    product=models.ForeignKey(Product, on_delete=models.DO_NOTHING)

class Product(models.Model):
    id = models.AutoField(db_column='Id', primary_key=True)
    description = models.CharField(max_length=60, db_column='Description')  

#admin.py
class TestAdmin(admin.ModelAdmin):
    fields = ['name','product','get_description']
    readonly_fields = ['get_description']

    def get_description(self):
        return self.product.description

自然地,此代码引发“ get_description”中的ErrorFields异常。

但是,当我插入模型Test的条目时,是否存在一种显示“ get_description”的方法?

谢谢

1 个答案:

答案 0 :(得分:0)

您可以覆盖ModelAdmin.get_form并更改其使用的格式,以添加您选择的字段,并填充您喜欢的任何内容。例如:

#admin.py
class TestAdmin(admin.ModelAdmin):
    fields = ['name','product']

    def get_form(self, request, obj=None, **kwargs):
        if obj.product:
            # self.form.base_fields is an OrderedDict(field_name=form.Field, ...)
            self.form.base_fields['product_description'] = forms.CharField(required=False, initial=obj.product.description)
            self.form.base_fields['product_description'].widget.attrs['readonly'] = True
        return super(TestAdmin, self).get_form(request, obj, **kwargs)

这将添加一个只读文本输入字段,作为“添加”表单中的最后一个字段。如果您希望将其放置在表单中的其他位置,则必须弄清楚一些逻辑,以完全按照您想要的顺序将self.form.base_fields重建为新的OrderedDict