Django ModelForm переопределить виджет - PullRequest
27 голосов
/ 26 марта 2012

Отказ от ответственности: я новичок в 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.

Спасибо!

1 Ответ

84 голосов
/ 07 марта 2014

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

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

Например, если вы хотите, чтобы CharField для атрибута имени 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...