2016-07-24 60 views
2

我有一个ModelForm,它呈现select字段,因为它指向ForeignKey。表单呈现时,将显示基于ForeignKey__unicode__定义的选项。Django选择字段 - 更改显示的内容

例如,我在表单中有一个select字段,用于从Contact模型中选择一个联系人。该Contact模型有:

def __unicode__(self): 
    return self.first_name 

因此,我在我的select领域的联系人列表只显示名字。

我知道我只能更改__unicode__定义,但我想知道如何根据select字段的显示位置来改变select选项中显示的内容。换句话说,在一些表格,我需要证明的东西,如:

{{ contact.first_name}} -- {{ contact.phone_number }}

,并在其他方面我只想表明:

{{ contact.first_name }}

如何去调整ModelForm这样特定字段,select字段指向ForeignKey模型Contact显示联系人的全名?

回答

4

据我所知这是一个ModelChoiceField所以你可以覆盖label_from_instanceDocs仅供参考。

class YouNewChoiceField(ModelChoiceField): 
    def label_from_instance(self, obj): 
     return "%s -- %s" % (obj.name, obj.phone_number) 

在表格内部使用您的新字段。

class YourForm(ModelForm) 
    # As you'd normally define your ModelChoiceField field 
    contact = YourNewChoiceField(queryset=...) 

    class Meta: 
     fields = ['contact', ...] 
+0

这是有希望的 - 但是这将如何适用于'ModelForm',其中表单是基于我创建的'models.Model'构建的。因此,而不是'类MyForm(forms.Form)'我正在使用'类MyForm(ModelForm)'。从那里,我定义了要使用的“模型”以及该模型中要使用的哪些字段。我不太清楚如何将新的'YourNewChoiceField'分配给ModelForm(如果有意义的话) – Garfonzo

+0

我可能已经找到了我的答案[here](https://docs.djangoproject.com/en/1.9/) topic/forms/modelforms /#overriding-the-default-fields),但它只能用于1.9,而我使用1.8 – Garfonzo

+0

'label_from_instance'也可在[Django 1.8]中使用(https://docs.djangoproject .COM/EN/1.8/REF /表格/场/#modelchoicefield)。至于你的第一个问题,你简单地重新定义了你的表单中的字段,我更新了答案。 –