Supposons que j'ai un formulaire
class SampleClass(forms.Form):
name = forms.CharField(max_length=30)
age = forms.IntegerField()
django_hacker = forms.BooleanField(required=False)
Existe-t-il un moyen pour moi de définir des classes css sur chaque champ de sorte 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.
python
django
django-forms
ashchristopher
la source
la source
Réponses:
Encore une autre solution qui ne nécessite pas de changements dans le code python et qui est donc meilleure pour les concepteurs et les changements de présentation ponctuels: django-widget-tweaks . J'espère que quelqu'un le trouvera utile.
la source
Répondu à ma propre question. Soupir
http://docs.djangoproject.com/en/dev/ref/forms/widgets/#django.forms.Widget.attrs
Je ne savais pas qu'il était passé dans le constructeur du widget.
la source
Voici une autre solution pour ajouter des définitions de classe aux widgets après avoir déclaré les champs de la classe.
la source
Utilisez django-widget-tweaks , il est facile à utiliser et fonctionne plutôt bien.
Sinon, cela peut être fait à l'aide d'un filtre de modèle personnalisé.
Considérant que vous rendez votre formulaire de cette façon:
form.subject est une instance de BoundField qui a la méthode as_widget .
vous pouvez créer un filtre personnalisé "addcss" dans "my_app / templatetags / myfilters.py"
Et puis appliquez votre filtre:
form.subjects sera alors rendu avec la classe css "MyClass".
J'espère que cette aide.
MODIFIER 1
Filtre à jour selon dimyG la réponse «
Ajouter un lien django-widget-tweak
MODIFIER 2
la source
get('class', None).split(' ')
échouera si la balise n'a pas l'attribut class, tel qu'ilNone
est renvoyé. Changer cela enget('class', '').split(' ')
fonctionneExtension de la méthode pointée sur docs.djangoproject.com:
Je pensais qu'il était difficile de connaître le type de widget natif pour chaque champ, et j'ai trouvé drôle de remplacer la valeur par défaut juste pour mettre un nom de classe sur un champ de formulaire. Cela semble fonctionner pour moi:
Cela me semble un peu plus propre.
la source
Si vous voulez que tous les champs du formulaire héritent d'une certaine classe, vous définissez simplement une classe parent, qui hérite de
forms.ModelForm
, puis en hériteCela m'a aidé à ajouter
'form-control'
automatiquement la classe à tous les champs de tous les formulaires de mon application, sans ajouter de réplication de code.la source
Voici un moyen simple de modifier la vue. ajoutez ci-dessous dans la vue juste avant de le passer dans le modèle.
la source
Ajoutez simplement les classes à votre formulaire comme suit.
la source
Voici une variante de ce qui précède qui donnera à tous les champs la même classe (par exemple jquery jolis coins arrondis).
la source
Vous pouvez essayer ceci.
Vous pouvez voir plus d'informations dans: Django Widgets
la source
Si vous souhaitez ajouter une classe au champ d'un formulaire dans un modèle (pas dans view.py ou form.py), par exemple dans le cas où vous souhaitez modifier des applications tierces sans remplacer leurs vues, puis un filtre de modèle comme décrit dans la réponse de Charlesthk est très pratique. Mais dans cette réponse, le filtre de modèle remplace toutes les classes existantes que le champ pourrait avoir.
J'ai essayé d'ajouter ceci en tant que modification, mais il a été suggéré d'écrire comme une nouvelle réponse.
Alors, voici une balise template qui respecte les classes existantes du champ:
la source
En fait, vous pouvez le faire dans le constructeur de formulaire ( fonction init ) ou après le lancement de la classe de formulaire. Ceci est parfois nécessaire si vous n'écrivez pas votre propre formulaire et que ce formulaire vient d'ailleurs -
la source
Vous pouvez également utiliser Django Crispy Forms , c'est un excellent outil pour définir des formulaires au cas où vous souhaiteriez utiliser un framework CSS comme Bootstrap ou Foundation. Et il est facile de spécifier des classes pour vos champs de formulaire.
Votre classe de formulaire aimerait alors ceci:
la source