3

我正在尝试显示以下模型中的版本字段,而不是默认str字段2_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 。

我如何返回版本 - 最简单的方法是什么?

任何帮助或指导表示赞赏。

4

2 回答 2

7

ModelChoiceField文档

将调用模型的__str__( __unicode__on Python 2) 方法来生成对象的字符串表示形式,以用于字段的选择;提供自定义的表示、子类ModelChoiceField和覆盖label_from_instance。此方法将接收模型对象,并应返回适合表示它的字符串。例如:

from django.forms import ModelChoiceField

class MyModelChoiceField(ModelChoiceField):
    def label_from_instance(self, obj):
        return "My Object #%i" % obj.id
于 2017-02-01T01:31:08.403 回答
3

如果我正确地回答了您的问题,您可以更改对象字符串表示

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)
于 2017-02-01T01:20:22.673 回答