django 显示__str__以外的字段

rvpgvaaj  于 2022-12-05  发布在  Go
关注(0)|答案(3)|浏览(167)

我正在尝试显示以下模型中的版本字段,而不是默认的str(即field2_name):
注意:这个SO链接Displaying a specific field in a django form可能比我需要的多,但我不是100%肯定。我试图实现这个,但不成功。
还要注意,我在https://docs.djangoproject.com/en/1.10/ref/forms/fields/上尝试了这个示例,但是无法使其工作
型号(通用名):

class CodeVersion(models.Model):
field1= models.ForeignKey(SomeOtherModel, on_delete=models.CASCADE)
field2_name = models.CharField(max_length=256)
field3_description = models.CharField(max_length=1000, blank=True)
version = models.PositiveIntegerField()

def __str__(self):
  return self.field2_name

表格:

class VersionsForm(forms.Form):

code_versions = forms.ModelChoiceField(queryset=CodeVersion.objects.none())

def __init__(self, SomeOtherModel_id):
   super(VersionsForm, self).__init__()
   self.fields['infocode_versions'].queryset = CodeVersion.objects.filter(SomeOtherModel_id=SomeOtherModel_id)

这是可行的-它返回预期的field2_name。
如何返回版本-最简单的方法是什么?
如有任何帮助或指导,我们将不胜感激。

fslejnso

fslejnso1#

来自ModelChoiceField文档:
将调用模型的__str__(Python 2上的__unicode__)方法来生成对象的字符串表示,以用于字段的选择;要提供自定义表示,请子类化ModelChoiceField并重写label_from_instance。此方法将接收一个模型对象,并应返回一个适合表示该对象的字符串。例如:

from django.forms import ModelChoiceField

class MyModelChoiceField(ModelChoiceField):
    def label_from_instance(self, obj):
        return "My Object #%i" % obj.id
s6fujrry

s6fujrry2#

如果我没猜错你的问题你可以改变对象字符串的表示形式

def __str__(self):
  return str(self.version)

然后,您可以继承ModelChoiceField并覆盖label_from_instance方法
或者猴子也可以这样修补

self.fields['field_name'].label_from_instance = self.label_from_instance

@staticmethod
def label_from_instance(self):
    return str(self.value)
iqjalb3h

iqjalb3h3#

在一行中:

self.fields['code_versions'].label_from_instance = lambda obj: f"{obj.version}"

完整示例

class VersionsForm(forms.Form):

    code_versions = forms.ModelChoiceField(queryset=CodeVersion.objects.none())
    
    def __init__(self, SomeOtherModel_id):
       super().__init__()
       self.fields['code_versions'].queryset = CodeVersion.objects.filter(SomeOtherModel_id=SomeOtherModel_id)
       self.fields['code_versions'].label_from_instance = lambda obj: f"{obj.version}"

相关问题