Как назначить TypedChoiceField в качестве класса формы для моделирования поля с вариантами выбора?

У меня было CharField with choices в модели, но мне нужно, чтобы это поле отображалось как CheckboxSelectMultiple, которое возвращает список в класс формы. С классом формы TypedChoiceField, который автоматически назначается Field с вариантами выбора, он не проверяется. Я решил изменить form_class в поле и написал новое поле с TypedMultipleChoiceField form_class, чтобы проверить список.

class MultipleTypedChoiceModelField(models.Field):
    def get_internal_type(self):
        return 'MultipleTypedChoiceModelField'

    def formfield(self, **kwargs):
        defaults =  {'form_class': TypedMultipleChoiceField, }
        defaults.update(kwargs)
        return super(MultipleTypedChoiceModelField, self).formfield(**defaults)

Но это не имеет никакого эффекта. Если бы я закомментировал варианты в поле модели, тип был бы MultipleTypedChoiceModelField. Поэтому я считаю, что form_class назначен в устройстве с определением списка вариантов.

def formfield(self, **kwargs):
    if self._choices: # or self.choices:
        defaults =  {'form_class': TypedMultipleChoiceField, }
        defaults.update(kwargs)
    return super(MultipleTypedChoiceModelField, self).formfield(**defaults)

Но и это не имеет никакого эффекта. Я не нашел, где находится назначение form_class. Может быть, у меня есть лучший способ изменить это поведение? Добавлять дополнительную модель с отношением "многие ко многим" я не планирую, потому что это явно не нужно.


person I159    schedule 15.11.2011    source источник


Ответы (1)


Часть проблемы заключается в том, что если у вас есть что-то подобное в вашей модели:

myfield = models.CharField(max_length=100, choices=MY_FIELD_CHOICES)

Django предполагает, что myfield содержит только один выбор, а не несколько вариантов.

Самый простой способ реализовать это - просто иметь что-то вроде этого в вашей модели:

myfield = models.CharField(max_length=100)

а затем в вашей пользовательской форме:

myfield = forms.MultipleChoiceField(choices=MY_FIELD_CHOICES, widget=forms.CheckboxSelectMultiple())
person Jordan Reiter    schedule 15.11.2011