Saltar al contenido

Agregar clase al campo de formulario Django ModelForm

Si encuentras algún fallo con tu código o proyecto, recuerda probar siempre en un entorno de testing antes aplicar el código al trabajo final.

Solución:

Si no puede usar una aplicación de terceros y desea agregar una clase (por ejemplo, “control de formulario”) a cada campo en un formulario de manera SECA, puede hacerlo en la clase de formulario __init__() método así:

class ExampleForm(forms.Form):
    # Your declared form fields here
    ...

    def __init__(self, *args, **kwargs):
        super(ExampleForm, self).__init__(*args, **kwargs)
        for visible in self.visible_fields():
            visible.field.widget.attrs['class'] = 'form-control'

Es posible que también deba manejar la verificación de clases existentes en attrs, si por alguna razón agregará clases declarativamente y dentro de __init__(). El código anterior no tiene en cuenta ese caso.

Vale la pena mencionar:

Ha especificado que no desea utilizar paquetes de terceros. Sin embargo, me tomaré un segundo para mencionar que una de las formas más simples de hacer que los formularios se muestren automáticamente al estilo de Bootstrap es usar django-crispy-forms, así:

# settings.py
CRISPY_TEMPLATE_PACK = 'bootstrap3'

# forms.py
from crispy_forms.helper import FormHelper
class ExampleForm(forms.Form):
    # Your declared form fields here
    ...
    helper = FormHelper()

# In your template, this renders the form Bootstrap-style:
% load crispy_forms_tags %
% crispy form %

puede agregar clases de CSS en formularios.py

subject = forms.CharField(label='subject', max_length=100 , widget=forms.TextInput(attrs='class': "form-control"))

Dado que me tomó más horas de las que me gustaría (novato de Django) resolver esto, también colocaré mi resultado aquí.

Configurar el widget en cada campo solo para agregar una clase una y otra vez va en contra de la regla de programación de repetición y conduce a muchas filas innecesarias. Esto sucede especialmente cuando se trabaja con formularios de arranque.

Aquí está mi ejemplo (de trabajo) para agregar no solo clases de arranque:

formularios.py

class CompanyForm(forms.Form):
    name = forms.CharField(label='Jméno')
    shortcut = forms.CharField(label='Zkratka')
    webpage = forms.URLField(label='Webové stránky')
    logo = forms.FileField(label='Logo')

templatetags/etiquetas_personalizadas.py

from django import template
from django.urls import reverse

register = template.Library()

@register.filter('input_type')
def input_type(ob):
    '''
    Extract form field type
    :param ob: form field
    :return: string of form field widget type
    '''
    return ob.field.widget.__class__.__name__


@register.filter(name='add_classes')
def add_classes(value, arg):
    '''
    Add provided classes to form field
    :param value: form field
    :param arg: string of classes seperated by ' '
    :return: edited field
    '''
    css_classes = value.field.widget.attrs.get('class', '')
    # check if class is set or empty and split its content to list (or init list)
    if css_classes:
        css_classes = css_classes.split(' ')
    else:
        css_classes = []
    # prepare new classes to list
    args = arg.split(' ')
    for a in args:
        if a not in css_classes:
            css_classes.append(a)
    # join back to single string
    return value.as_widget(attrs='class': ' '.join(css_classes))

reusable_form_fields.html (plantilla)

% load custom_tags %

% csrf_token %
% for field in form %
    
% if field
field.label_tag
field % if field.help_text % field.help_text % endif %
% else % ... % endif %
% endfor %

Reseñas y calificaciones

Si te apasiona la informática, tienes el poder dejar un ensayo acerca de qué le añadirías a este post.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *