Django ModelChoiceField выпадающий список пользовательских популяций - PullRequest
3 голосов
/ 11 марта 2012

У меня есть выпадающий список, который заполняется отфильтрованным списком объектов из модели «Опции».В настоящее время в раскрывающемся списке отображаются названия каждого параметра.Как мне заставить его отображать другой атрибут из той же таблицы?

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

Быстрый пример: в раскрывающемся списке в настоящее время отображаются названия автомобилей: «Camero, Nissan, Honda». Как получить отображение цвета каждого автомобиля («черный, черный, белый»)?).Обратите внимание, что цвет также является полем в таблице параметров.

1 Ответ

3 голосов
/ 11 марта 2012

Вы можете переопределить label_from_instance на ModelChoiceField после его создания.

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)
...