Nie ma znaczenia, czy jest to dodatkowe pole. To działa:
class FooForm(forms.ModelForm):
class Meta:
model = People
widgets = {
'name': forms.Textarea(attrs={'placeholder': u'Bla bla'}),
}
tego nie robi:
class FooForm(forms.ModelForm):
name = forms.CharField()
class Meta:
model = People
widgets = {
'name': forms.Textarea(attrs={'placeholder': u'Bla bla'}),
}
To not documented indeed, to najlepsze co mogłem znaleźć w docs, które mogą odnosić się do tego zachowania (a może nie, to po prostu najlepszy mogę znaleźć):
Jeśli wyraźnie instancji pole formularza tak, Django zakłada, że chcesz całkowicie określić jego zachowanie [...] należy jawnie ustawić odpowiednie argumenty podczas deklarowania pola formularza.
Realizacja tego postępowania jest django linii// postacie models.py 219.
204 if opts.model:
205 # If a model is defined, extract form fields from it.
206 fields = fields_for_model(opts.model, opts.fields,
207 opts.exclude, opts.widgets, formfield_callback)
208 # make sure opts.fields doesn't specify an invalid field
209 none_model_fields = [k for k, v in fields.iteritems() if not v]
210 missing_fields = set(none_model_fields) - \
EE 211 set(declared_fields.keys())
212 if missing_fields:
213 message = 'Unknown field(s) (%s) specified for %s'
214 message = message % (', '.join(missing_fields),
215 opts.model.__name__)
216 raise FieldError(message)
217 # Override default model fields with any custom declared ones
218 # (plus, include all the other declared fields).
219 fields.update(declared_fields)
po linii 206 pól [ 'Nazwa'] widget jest rzeczywiście Textarea podano w Meta.widgets.
W linii 219 pola są aktualizowane za pomocą zadeklarowanych pól i pól ["nazwa"]. Widżet staje się django.forms.widgets.TextInput, który jest domyślny dla CharField.
Podobno definicje pól jawnych mają priorytet.
Dzięki za pytanie, dobrze wiedzieć, świetne pytanie.
Na pewno są na Django 1.4? Form.Meta.widgets został wprowadzony w Django 1.4. – jpic
Tak. 'Wersja Django: \t 1.4' –