Django重写modelform中外键字段的显示名称

2024-10-03 09:16:17 发布

您现在位置:Python中文网/ 问答频道 /正文

假设以下模型:

from django.db import models


class Status:
    name = models.CharField(max_length=50)
    order = models.PositiveIntegerField()

    def __str__(self):
        return self.name

class Article:
    headline = models.CharField(max_length=100)
    status = models.ForeignKey(Status, on_delete=models.CASCADE, null=True)

我想为Article模型创建管理表单,但不想使用Status模型的__str__方法的结果作为状态选择表单字段中的显示名称。它可以通过覆盖label_from_instance方法ModelChoiceField来实现,如下所示:

from django import forms

from blog.models import Status, Article

class StatusModelChoiceField(forms.ModelChoiceField):
    def label_from_instance(self, status):
        label = f"{status.order}: {status.name}"

        return label

class ArticleForm(forms.ModelForm):
    status = StatusModelChoiceField(queryset = Status.objects.all())

    class Meta:
        model = Article
        fields = ('headline', 'status')

此方法的问题在于,它不考虑Article模型的status字段定义。例如,尽管status字段在Article模型中可以为空,但在ArticleForm中它是必需的。我应该明确地告诉您,它不是必需的(status = StatusModelChoiceField(queryset = Status.objects.all(), required=False))。如果status字段将具有limit_choices_to,那么在我的表单中也不会动态地考虑它

因此,我只需要不同于默认__str__的显示名称。我如何才能以更加干练的方式实现这个目标


Tags: 方法namefrom模型importselfmodelsstatus
1条回答
网友
1楼 · 发布于 2024-10-03 09:16:17

尽管您必须使自定义字段继承自ModelChoiceField,但您可以通过使用可以在表单Meta(参考Overriding the default fields [Django docs])上设置的field_classes属性将其设置为要用于字段的类:

class ArticleForm(forms.ModelForm):

    class Meta:
        model = Article
        fields = ('headline', 'status')
        field_classes = {
            'status': StatusModelChoiceField,
        }

相关问题 更多 >