widgets formularios form fields example avanzados python django django-forms

python - formularios - post django



¿Cómo agrego un marcador de posición en un CharField en Django? (5)

Gran pregunta Hay tres soluciones que conozco:

Solución n. ° 1

Reemplace el widget predeterminado.

class SearchForm(forms.Form): q = forms.CharField( label=''Search'', widget=forms.TextInput(attrs={''placeholder'': ''Search''}) )

Solución n. ° 2

Personaliza el widget predeterminado. Si está utilizando el mismo widget que usa habitualmente el campo, simplemente puede personalizarlo en lugar de crear uno completamente nuevo.

class SearchForm(forms.Form): q = forms.CharField(label=''Search'') def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields[''q''].widget.attrs.update({''placeholder'': ''Search''})

Solución n. ° 3

Finalmente, si está trabajando con un formulario de modelo, entonces ( además de las dos soluciones anteriores ) tiene la opción de especificar un widget personalizado para un campo estableciendo el atributo de widgets de la Meta interna.

class CommentForm(forms.ModelForm): class Meta: model = Comment widgets = { ''body'': forms.Textarea(attrs={''cols'': 80, ''rows'': 20}) }

Tome esta forma muy simple, por ejemplo.

class SearchForm(Form): q = forms.CharField(label=''search'')

Esto se representa en la plantilla:

<input type="text" name="q" id="id_q" />

Sin embargo, quiero agregar el atributo ''marcador de posición'' a este campo con un valor de "Buscar" para que el HTML se vea algo así como:

<input type="text" name="q" id="id_q" placeholder="Search" />

Preferiblemente, me gustaría pasar el valor del marcador de posición en CharField en la clase de formulario a través de un diccionario o algo así como:

q = forms.CharField(label=''search'', placeholder=''Search'')

¿Cuál sería la mejor manera de lograr esto?


Los otros métodos son buenos. Sin embargo, si prefiere no especificar el campo (por ejemplo, para algún método dinámico), puede usar esto:

def __init__(self, *args, **kwargs): super(MyForm, self).__init__(*args, **kwargs) self.fields[''email''].widget.attrs[''placeholder''] = self.fields[''email''].label or ''[email protected]''

También permite que el marcador de posición dependa de la instancia de ModelForms con la instancia especificada.


Mira la documentación de widgets . Básicamente se vería así:

q = forms.CharField(label=''search'', widget=forms.TextInput(attrs={''placeholder'': ''Search''}))

Más escritos, sí, pero la separación permite una mejor abstracción de casos más complicados.

También puede declarar un atributo de widgets contiene un mapeo <field name> => <widget instance> directamente en el Meta de su ModelForm .


Para un ModelForm, puede usar la clase Meta así:

from django import forms from .models import MyModel class MyModelForm(forms.ModelForm): class Meta: model = MyModel widgets = { ''name'': forms.TextInput(attrs={''placeholder'': ''Name''}), ''description'': forms.Textarea( attrs={''placeholder'': ''Enter description here''}), }


Puede usar este código para agregar un marcador de posición para cada campo de entrada de texto en su formulario. El texto para los marcadores de posición se tomará de las etiquetas de campo modelo.

class PlaceholderDemoForm(forms.ModelForm): def __init__(self, *args, **kwargs): super(PlaceholderDemoForm, self).__init__(*args, **kwargs) for field_name in self.fields: field = self.fields.get(field_name) if field: if type(field.widget) in (forms.TextInput, forms.DateInput): field.widget = forms.TextInput(attrs={''placeholder'': field.label}) class Meta: model = DemoModel