В дополнение к выбранному ответу: чтобы использовать AdvancedModelChoiceField и по-прежнему отображать форму с помощью обычных виджетов, я переклассифицировал виджет django и переопределил некоторые методы.Первый метод будет Optgroups.Замените
for index, (option_value, option_label) in enumerate(chain(self.choices)):
на
for index, (option_value, option_label, obj) in enumerate(chain(self.choices)):
Затем нам нужно передать этот объект в параметр.
def create_option(self, name, value, label, selected, index, subindex=None, attrs=None, obj=None):
option = super(RadioSelect, self).create_option(name, value, label, selected, index, subindex, attrs)
option['obj'] = obj
return option
В шаблоне виджета доступ к объекту выглядит следующим образом:
{{ widget.obj.object_attr }}
И, наконец, мы можем использовать наш собственный виджет и поле в нашей форме:
class MyForm(forms.ModelForm):
myfield = AdvancedModelChoiceField(
widget=MyWidget,
queryset=MyModel.objects.all(),
empty_label=None
)