gpt4 book ai didi

python - Django覆盖模型形式中外键字段的显示名称

转载 作者:行者123 更新时间:2023-12-04 07:44:07 25 4
gpt4 key购买 nike

假设以下模型:

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 创建管理表单模型,但不想使用 __str__ 的结果 Status的方法模型作为状态选择表单字段中的显示名称。可以通过覆盖 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 ,您可以做的是使用 field_classes 将其设置为用于您的字段的类。可以在表单上设置的属性 Meta (引用 Overriding the default fields [Django docs]):

class ArticleForm(forms.ModelForm):

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

关于python - Django覆盖模型形式中外键字段的显示名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67289586/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com