Как назначить TypedChoiceField в качестве класса формы для модели поля с выбором? - PullRequest
2 голосов
/ 15 ноября 2011

У меня было 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. Может быть, у меня есть лучший способ изменить это поведение? Добавление дополнительной модели со многими ко многим я не планирую, потому что это явно не нужно.

1 Ответ

1 голос
/ 15 ноября 2011

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

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