假设以下模型:
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__
的显示名称。我如何才能以更加干练的方式实现这个目标
尽管您必须使自定义字段继承自
ModelChoiceField
,但您可以通过使用可以在表单Meta
(参考Overriding the default fields [Django docs])上设置的field_classes
属性将其设置为要用于字段的类:相关问题 更多 >
编程相关推荐