在ModelChoiceField Django中使用__unicode__以外的方法

时间:2012-07-11 16:22:26

标签: python django forms django-forms django-queryset

我正在研究Django中的一些表格。一个字段是模型中的ForeignKey,因此在表单中表示为ModelChoiceFieldModelChoiceField当前使用模型的__unicode__方法填充列表,这不是我想要的行为。我希望能够使用该模型的另一种方法。从文档来看,我似乎可以强制使用自己的QuerySet,但我看不出这会如何帮助我使用__unicode__以外的方法。

如果可能的话,我真的宁愿避免将其与默认表单方法分开。

有什么建议吗?

2 个答案:

答案 0 :(得分:10)

您可以覆盖label_from_instance以指定其他方法:

from django.forms.models import ModelChoiceField

class MyModelChoiceField(ModelChoiceField):

    def label_from_instance(self, obj):
        return obj.my_custom_method()

然后,您可以在表单中使用此字段。此方法旨在在子类中重写。以下是django.forms.models中的原始来源:

# this method will be used to create object labels by the QuerySetIterator.
# Override it to customize the label.
def label_from_instance(self, obj):
    """
    This method is used to convert objects into strings; it's used to
    generate the labels for the choices presented by this object. Subclasses
    can override this method to customize the display of the choices.
    """
    return smart_unicode(obj)

答案 1 :(得分:1)

与其说是自定义查询集,而是将查询集转换为列表。如果您只是choices=some_queryset Django以下列形式做出选择:

(item.pk, item.__unicode__())

所以,只需使用列表理解即可自行完成:

choices=[(item.pk, item.some_other_method()) for item in some_queryset]