example django forms attributes django-forms form-fields

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>

biblioteca django-widget-tweaks