我正在尝试显示以下模型中的版本字段,而不是默认的 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。
如何返回版本 - 最简单的方法是什么?
感谢任何帮助或指导。
答案 0 :(得分:4)
将调用模型的
__unicode__
({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
。此方法将接收模型对象,并应返回适合表示它的字符串。例如:let yourString = '1a2b3c4d'; let yourArray = yourString.split(''); let letterArray = []; let numberArray = []; yourArray.forEach(item => { if(isNaN(item) && typeof item === 'string'){ letterArray.push(item); } else if(!isNaN(item) { numberArray.push(item); } }); console.log(letterArray, numberArray);
答案 1 :(得分:2)
如果我正确地提出了您的问题,您可以更改对象字符串表示
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)