210 votes

Définir la classe css dans les formulaires django

Suppose que j'ai un formulaire

 class SampleClass(forms.Form):
    name = forms.CharField(max_length=30)
    age = forms.IntegerField()
    django_hacker = forms.BooleanField(required=False)
 

Y at-il un moyen pour moi de définir des classes css sur chaque champ afin que je puisse ensuite utiliser jQuery en fonction de la classe dans ma page rendue?

J'espérais ne pas avoir à créer manuellement le formulaire.

193voto

Mikhail Korobov Points 6225

Une autre solution qui ne nécessite aucune modification du code python est donc préférable pour les concepteurs et les changements de présentation uniques: django-widget-tweaks ( bitbucket , github ). J'espère que quelqu'un le trouvera utile.

97voto

ashchristopher Points 3793

Répond à ma propre question. Soupir

http://docs.djangoproject.com/en/dev/ref/forms/widgets/#django.forms.Widget.attrs

Je n'ai pas réalisé qu'il était passé dans le constructeur de widget.

84voto

ashchristopher Points 3793

Voici une autre solution pour ajouter des définitions de classe aux widgets après avoir déclaré les champs dans la classe.

 def __init__(self, *args, **kwargs):
    super(SampleClass, self).__init__(*args, **kwargs)
    self.fields['name'].widget.attrs['class'] = 'my_class'
 

50voto

Charlesthk Points 361

Cela peut être fait à l'aide d'un modèle personnalisé de filtre. en considérant que vous avez rendu votre formulaire de cette façon :

<form action="/contact/" method="post">
    {{ form.non_field_errors }}
    <div class="fieldWrapper">
        {{ form.subject.errors }}
        <label for="id_subject">Email subject:</label>
        {{ form.subject }}
    </div>
</form>

forme.l'objet est une instance de BoundField qui a le as_widget méthode.

vous pouvez créer un filtre personnalisé "addcss" dans "my_app/templatetags/myfilters.py"

from django import template

register = template.Library()

@register.filter(name='addcss')
def addcss(value, arg):
    return value.as_widget(attrs={'class': arg})

Puis appliquez votre filtre:

{% load myfilters %}
<form action="/contact/" method="post">
    {{ form.non_field_errors }}
    <div class="fieldWrapper">
        {{ form.subject.errors }}
        <label for="id_subject">Email subject:</label>
        {{ form.subject|addcss:'MyClass' }}
    </div>
</form>

forme.les sujets seront ensuite rendus à l' "MyClass" classe css.

Espérons que cette aide.

34voto

Dave Points 520

Développement de la méthode pointée sur docs.djangoproject.com:

 class MyForm(forms.Form): 
    comment = forms.CharField(
            widget=forms.TextInput(attrs={'size':'40'}))
 

Je pensais que c'était gênant d'avoir à connaître le type de widget natif pour chaque champ, et j'ai trouvé amusant de remplacer le paramètre par défaut uniquement pour mettre un nom de classe sur un champ de formulaire. Cela semble fonctionner pour moi:

 class MyForm(forms.Form): 
    #This instantiates the field w/ the default widget
    comment = forms.CharField()

    #We only override the part we care about
    comment.widget.attrs['size'] = '40'
 

Cela me semble un peu plus propre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X