Показать атрибут внешнего ключа в add_form в Django - PullRequest
0 голосов
/ 25 октября 2018

Возможно ли показать атрибут внешнего ключа в 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

Естественно, этот код вызывает исключение ErrorFields в 'get_description'.

Но существует ли способ показать 'get_description', когда я вставляю запись модели Test?

Спасибо

1 Ответ

0 голосов
/ 26 октября 2018

Вы можете переопределить 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 в том порядке, в котором вы хотите.

...