显示__str__以外的字段

时间:2017-02-01 00:18:27

标签: django django-forms modelchoicefield

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

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

感谢任何帮助或指导。

2 个答案:

答案 0 :(得分:4)

来自ModelChoiceField docs

  

将调用模型的__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)