example - Cómo agregar atributos de marcadores de posición, identificación y posición a un campo en los formularios modelo de django
django choicefield (8)
Agregando a la respuesta de Derick Hayes, creé una clase BasicForm que extiende las formas. ModelForm que agrega las clases bootstrap a todas las formas que lo extienden.
Para mis formularios, simplemente extiendo BasicForm en lugar del formulario modelo y automáticamente obtengo clases de arranque en todos los formularios. Fui un paso más allá y agregué las clases a cualquier clase de css personalizada que ya esté allí.
class BaseModelForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(BaseModelForm, self).__init__(*args, **kwargs)
# add common css classes to all widgets
for field in iter(self.fields):
#get current classes from Meta
classes = self.fields[field].widget.attrs.get("class")
if classes is not None:
classes += " form-control"
else:
classes = "form-control"
self.fields[field].widget.attrs.update({
''class'': classes
})
Tengo un modelo django como el de abajo.
modelos.py
class Product(models.Model):
name = models.CharField(max_length = 300)
description = models.TextField(max_length = 2000)
created = models.DateTimeField(auto_now_add = True)
updated = models.DateTimeField(auto_now = True)
def __unicode__(self):
return self.name
forms.py
class ProductForm(ModelForm):
class Meta:
model = Product
exclude = (''updated'', ''created'')
product_form.py (solo un ejemplo)
<form enctype="multipart/form-data" action="{% url ''add_a_product'' %}" method="post">
<div id="name">
{{form.name}}
</div>
<div id="description">
{{form.description}}
</div>
</form>
En realidad quiero mostrar / renderizar la salida html como abajo
<input id="common_id_for_inputfields" type="text" placeholder="Name" class="input-calss_name" name="Name">
<input id="common_id_for_inputfields" type="text" placeholder="Description" class="input-calss_name" name="description">
¿Finalmente, cómo agregar atributos (id, marcador de posición, clase) a los campos de formulario modelo en el código anterior?
Los identificadores de los campos deben ser generados automáticamente por django, para anular otros campos:
class ProductForm(ModelForm):
class Meta:
model = Product
exclude = (''updated'', ''created'')
def __init__(self, *args, **kwargs):
super(ProductForm, self).__init__(*args, **kwargs)
self.fields[''name''].widget.attrs/
.update({
''placeholder'': ''Name'',
''class'': ''input-calss_name''
})
Puede actualizar forms.py como abajo
class ProductForm(ModelForm):
class Meta:
model = Product
exclude = (''updated'', ''created'')
widgets={
"name":forms.TextInput(attrs={''placeholder'':''Name'',''name'':''Name'',''id'':''common_id_for_imputfields'',''class'':''input-class_name''}),
"description":forms.TextInput(attrs={''placeholder'':''description'',''name'':''description'',''id'':''common_id_for_imputfields'',''class'':''input-class_name''}),
}
Puedes hacer lo siguiente:
#forms.py
class ProductForm(ModelForm):
class Meta:
model = Product
exclude = (''updated'', ''created'')
def __init__(self, *args, **kwargs):
super(ProductForm, self).__init__(*args, **kwargs)
self.fields[''description''].widget = TextInput(attrs={
''id'': ''myCustomId'',
''class'': ''myCustomClass'',
''name'': ''myCustomName'',
''placeholder'': ''myCustomPlaceholder''})
Puedes hacer lo siguiente:
class ProductForm(ModelForm):
name = forms.CharField(label=''name '',
widget=forms.TextInput(attrs={''placeholder'': ''name ''}))
Realmente me gusta la respuesta de Dmitriy Sintsov pero no funciona. Aquí hay una versión que funciona:
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for field in iter(self.fields):
self.fields[field].widget.attrs.update({
''class'': ''form-control''
})
Versión ligeramente modificada de excelente respuesta mariodev, agregando clase bootstrap a todos los campos de formulario, por lo que no tengo que volver a crear los widgets de entrada de formulario para cada campo manualmente (corto Python 3.x super ()):
class ProductForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for field in self.Meta.fields:
self.fields[field].widget.attrs.update({
''class'': ''form-control''
})
filtro add_class para agregar una clase CSS al campo de formulario:
{% load widget_tweaks %}
<form enctype="multipart/form-data" action="{% url ''add_a_product'' %}" method="post">
<div id="name">
{{form.name|add_class:"input-calss_name"}}
</div>
<div id="description">
{{form.description|add_class:"input-calss_name"}}
</div>
</form>