Django ModelChoiceField下拉框自定义填充

时间:2012-03-11 17:52:37

标签: django django-models django-forms django-views

我有一个下拉框,由模型“选项”中的过滤对象列表填充。目前,下拉列表显示每个选项的名称。如何让它显示同一个表中的另一个属性?

self.fields['name'] = forms.ModelChoiceField(queryset = Options.objects.filter(option_type = s), label = field_label, required=False) 

快速示例:下拉框当前显示汽车的名称:“Camero,Nissan,Honda” 如何让它显示每辆车的颜色(“黑色,黑色,白色”)。请注意,颜色也是Option表中的一个字段。

1 个答案:

答案 0 :(得分:3)

您可以在构建后覆盖ModelChoiceField上的label_from_instance

self.fields['name'] = forms.ModelChoiceField(queryset = Options.objects.filter(option_type = s), label = field_label, required=False)
self.fields['name'].label_from_instance = lambda obj: "{0} {1}".format(obj.name, obj.color)

根据评论更新只显示一次颜色:

class MyModelChoiceField(forms.ModelChoiceField):
     def __init__(self, *args, **kwargs):
          super(MyModelChoiceField, self).__init__(self, *args, **kwargs)
          self.shown_colors = []


     def label_from_instance(self, obj):
          if obj.color not in self.shown_colors:
               self.shown_colors.append(obj.color)
               return "{0} {1}".format(obj.name, obj.color)
          else:
               return obj.name


self.fields['name'] = MyModelChoiceField(queryset = Options.objects.filter(option_type = s), label = field_label, required=False)