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

Tome esta forma muy simple, por ejemplo.

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

Esto se representa en la plantilla:

  

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 como:

  

Preferiblemente, me gustaría pasar el valor de marcador de posición a 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?

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

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

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

También puede declarar un atributo de widgets contenga una asignación => directamente en el Meta de su ModelForm .

Para un ModelForm, puedes 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'}), } 

Los otros métodos son todos buenos. Sin embargo, si prefiere no especificar el campo (por ejemplo, para algún método dynamic), 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@address.nl' 

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

Puede usar este código para agregar el marcador de posición attr para cada campo TextInput en su formulario. El texto para los marcadores de posición se tomará de las tags de campo del 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 

Gran pregunta Hay tres soluciones que conozco:

Solución # 1

Reemplace el widget por defecto.

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

Solución # 2

Personaliza el widget por defecto. Si está utilizando el mismo widget que usualmente usa el campo, simplemente puede personalizarlo en lugar de crear una instancia totalmente nueva.

 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 # 3

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

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