Подтвердить что ты не робот

Django ModelForm переопределить виджет

Отказ от ответственности: я начинаю с python и Django, но имею опыт программирования Drupal.

Как я могу переопределить виджет по умолчанию:

#models.py
class Project(models.Model):
color_mode = models.CharField(max_length=50, null=True, blank=True, help_text='colors - e.g black and white, grayscale')

в моей форме с полем выбора? Является ли следующее ОК или я что-то не хватает?

#forms.py
from django.forms import ModelForm, Select
class ProjectForm(ModelForm):
    class Meta:
        model = Project
        fields = ('title', 'date_created', 'path', 'color_mode')
        colors = (
                   ('mixed', 'Mixed (i.e. some color or grayscale, some black and white)'),
                   ('color_grayscale', 'Color / Grayscale'),
                   ('black_and_white', 'Black and White only'),
                   )
        widgets = {'color_mode': Select(choices=colors)}

После прочтения https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#overriding-the-default-field-types-or-widgets я потерялся, так как в этом примере обсуждается только TextArea, и обсуждение виджетов, по-видимому, исключает ModelForm.

Спасибо!

4b9b3361

Ответ 1

Если вы хотите переопределить виджет для поля формы вообще, лучше всего установить атрибут widgets класса ModelForm Meta:

Чтобы указать пользовательский виджет для поля, используйте атрибут widgets внутреннего класса Meta. Это должно быть имена полей сопоставления словаря для классов или экземпляров виджетов.

Например, если вы хотите, чтобы CharField для атрибута name Author был представлен <textarea> вместо его по умолчанию <input type="text">, вы можете переопределить виджет полей:

from django.forms import ModelForm, Textarea
from myapp.models import Author

class AuthorForm(ModelForm):
    class Meta:
        model = Author
        fields = ('name', 'title', 'birth_date')
        widgets = {
            'name': Textarea(attrs={'cols': 80, 'rows': 20}),
        }

Словарь виджетов принимает либо экземпляры виджета (например, Textarea (...)), либо классы (например, Textarea).

https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#overriding-the-default-fields