python - partir - Especificando widget para el campo extra de formulario modelo(Django)
formularios avanzados django (2)
No importa si es un campo extra. Esto funciona:
class FooForm(forms.ModelForm):
class Meta:
model = People
widgets = {
''name'': forms.Textarea(attrs={''placeholder'': u''Bla bla''}),
}
Esto no hace
class FooForm(forms.ModelForm):
name = forms.CharField()
class Meta:
model = People
widgets = {
''name'': forms.Textarea(attrs={''placeholder'': u''Bla bla''}),
}
Esto no está documentado , eso es lo mejor que pude encontrar en los documentos que podrían relacionarse con ese comportamiento (tal vez no, es lo mejor que pude encontrar):
Si crea una instancia explícita de un campo de formulario como este, Django asume que desea definir completamente su comportamiento , debe establecer los argumentos relevantes explícitamente al declarar el campo de formulario .
La implementación de este comportamiento está en la línea 219 de django / forms / models.py:
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)
Después de la línea 206, los campos [''nombre'']. Widget es de hecho el Textarea especificado en Meta.widgets.
En la línea 219, los campos se actualizan con declarados campos, y los campos [''nombre'']. Widget se convierte en django.forms.widgets.TextInput, que es el valor predeterminado para CharField.
Aparentemente, las definiciones de campos explícitos tienen prioridad.
Gracias por preguntar, es bueno saberlo, gran pregunta.
Tengo que agregar un campo adicional a mi formulario de modelo. Mi enfoque es:
class MyForm(forms.ModelForm):
extra_field = forms.CharField()
class Meta:
model = MyModel
widgets = {
#Does not work
''extra_field'': forms.Textarea(attrs={''placeholder'': u''Bla bla''}),
}
Pero parece que la definición del widget para extra_field
en la class Meta
se ignora, porque tengo una etiqueta de entrada en lugar de textarea en una plantilla. Entonces aplico el siguiente enfoque:
class MyForm(forms.ModelForm):
#It works fine
extra_field = forms.CharField(widget=forms.Textarea())
class Meta:
model = MyModel
Funciona perfectamente para mí, pero solía especificar widgets para campos de formulario en la class Meta
declaración class Meta
. Así que me pregunto:
¿Por qué mi primer enfoque no funciona? ¿Que estoy haciendo mal?
Resolví la situación anterior con lo siguiente:
class FooForm(forms.ModelForm):
name = forms.CharField(widget=TextArea(attrs={''placeholder'': u''Bla bla''}))
class Meta:
model = People