Tiré de ma réponse à:
Comment baliser les champs de formulaire avec <div class = 'field_type'> dans Django
class MyForm(forms.Form):
myfield = forms.CharField(widget=forms.TextInput(attrs={'class' : 'myfieldclass'}))
ou
class MyForm(forms.ModelForm):
class Meta:
model = MyModel
def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
self.fields['myfield'].widget.attrs.update({'class' : 'myfieldclass'})
ou
class MyForm(forms.ModelForm):
class Meta:
model = MyModel
widgets = {
'myfield': forms.TextInput(attrs={'class': 'myfieldclass'}),
}
--- EDIT ---
Ce qui précède est la modification la plus simple à apporter au code de la question d'origine qui accomplit ce qui a été demandé. Cela vous empêche également de vous répéter si vous réutilisez le formulaire ailleurs; vos classes ou autres attributs ne fonctionnent que si vous utilisez les méthodes de formulaire as_table / as_ul / as_p de Django. Si vous avez besoin d'un contrôle total pour un rendu entièrement personnalisé, cela est clairement documenté
- EDIT 2 ---
Ajout d'une nouvelle façon de spécifier un widget et des attrs pour un ModelForm.
id
. Deuxièmement, c'est généralement la responsabilité du côté modèle de faire exactement cela, surtout si vous allez accéder à cette classe via des méthodes frontales (js, css). Je n'ai pas dit que votre réponse était fausse. À mon avis, c'est juste une mauvaise pratique (surtout lorsque vous travaillez dans une équipe avec des développeurs frontend et backend).Cela peut être fait à l'aide d'un filtre de modèle personnalisé. Pensez à rendre votre formulaire de cette façon:
form.subject
est une instanceBoundField
dont a laas_widget()
méthode.Vous pouvez créer un filtre personnalisé
addclass
dans my_app / templatetags / myfilters.py :Et puis appliquez votre filtre:
form.subjects
sera alors rendu avec laMyClass
classe CSS.la source
{{ form.subject|addclass:'myclass1 myclass2' }}
Si vous ne souhaitez pas ajouter de code au formulaire (comme mentionné dans les commentaires de la réponse de @ shadfc), c'est certainement possible, voici deux options.
Tout d'abord, il vous suffit de référencer les champs individuellement dans le HTML, plutôt que l'ensemble du formulaire à la fois:
(Notez que je l'ai également changé en une liste non triée .)
Deuxièmement, notez dans la documentation sur la sortie de formulaires au format HTML , Django:
Tous vos champs de formulaire ont déjà un identifiant unique . Vous feriez donc référence à id_subject dans votre fichier CSS pour styliser le champ sujet . Je dois noter que voici comment le formulaire se comporte lorsque vous prenez la valeur par défaut HTML , ce qui nécessite simplement d'imprimer le formulaire, pas les champs individuels:
Voir le lien précédent pour d'autres options lors de la sortie de formulaires (vous pouvez faire des tableaux, etc.).
Remarque - Je me rends compte que ce n'est pas la même chose que d'ajouter une classe à chaque élément (si vous avez ajouté un champ au formulaire, vous devrez également mettre à jour le CSS) - mais il est assez facile de référencer tous les champs par id dans votre CSS comme ceci:
la source
Selon cet article de blog, vous pouvez ajouter des classes css à vos champs à l'aide d'un filtre de modèle personnalisé.
la source
Vous pouvez faire comme ceci:
J'espère que ça marche.
Ignas
la source
Vous pouvez utiliser cette bibliothèque: https://pypi.python.org/pypi/django-widget-tweaks
Il vous permet d'effectuer les opérations suivantes:
la source
render_field
.Tu peux faire:
Ensuite, vous pouvez ajouter des classes / id à, par exemple, la
<td>
balise. Vous pouvez bien sûr utiliser toutes les autres balises de votre choix. Cochez Travailler avec les formulaires Django comme exemple de ce qui est disponible pour chacunfield
dans le formulaire ({{field}}
par exemple, il s'agit simplement de sortir la balise d'entrée, pas l'étiquette, etc.).la source
Une solution consiste à utiliser JavaScript pour ajouter les classes CSS requises une fois la page prête. Par exemple, styliser la sortie du formulaire django avec des classes bootstrap (jQuery utilisé par souci de concision):
Cela évite la laideur de mélanger les spécificités du style avec votre logique métier.
la source
Écrivez votre formulaire comme:
Dans votre champ HTML, faites quelque chose comme:
Ensuite, dans votre CSS, écrivez quelque chose comme:
J'espère que cette réponse vaut la peine d'être essayée! Notez que vous devez avoir écrit vos vues pour rendre le fichier HTML qui contient le formulaire.
la source
Vous n'aurez peut-être pas besoin de remplacer votre classe de formulaire
__init__
, car Django définitname
etid
attribue des attributs dans les HTMLinput
. Vous pouvez avoir CSS comme ceci:la source
id
champ créé par Django pour les ensembles de formulaires devient assez poilu…Je n'ai pas vraiment vu celui-ci ...
https://docs.djangoproject.com/en/1.8/ref/forms/api/#more-granular-output
Sortie plus granulaire
Les méthodes as_p (), as_ul () et as_table () sont simplement des raccourcis pour les développeurs paresseux - elles ne sont pas la seule façon d'afficher un objet de formulaire.
class BoundField Utilisé pour afficher le HTML ou accéder aux attributs d'un seul champ d'une instance de formulaire.
La méthode str () ( unicode sur Python 2) de cet objet affiche le code HTML de ce champ.
Pour récupérer un seul BoundField, utilisez la syntaxe de recherche de dictionnaire sur votre formulaire en utilisant le nom du champ comme clé:
Pour récupérer tous les objets BoundField, parcourez le formulaire:
La sortie spécifique au champ respecte le paramètre auto_id de l'objet de formulaire:
la source
Il y a un très facile à installer et un excellent outil conçu pour Django que j'utilise pour le style et il peut être utilisé pour tous les frameworks frontaux tels que Bootstrap, Materialize, Foundation, etc. Il s'appelle widget-tweaks Documentation: Widget Tweaks
depuis les formulaires d'importation django
Au lieu d'utiliser default:
Vous pouvez le modifier à votre guise en utilisant l'attribut render_field qui vous donne une manière plus html de le styliser comme cet exemple:
template.html
Cette bibliothèque vous donne la possibilité d'avoir votre front-end bien séparé de votre backend
la source
Dans Django 1.10 (peut-être plus tôt également), vous pouvez le faire comme suit.
Modèle:
Forme:
Modèle:
la source
Edit: Une autre façon (légèrement meilleure) de faire ce que je suggère est répondue ici: Style de champ d'entrée de formulaire Django
Toutes les options ci-dessus sont géniales, j'ai juste pensé ajouter celle-ci parce qu'elle est différente.
Si vous voulez un style personnalisé, des classes, etc. sur vos formulaires, vous pouvez créer une entrée html dans votre modèle qui correspond à votre champ de formulaire. Pour un CharField, par exemple, (le widget par défaut est
TextInput
), disons que vous voulez une entrée de texte de type bootstrap. Vous feriez quelque chose comme ceci:<input type="text" class="form-control" name="form_field_name_here">
Et tant que vous mettez le nom du champ de formulaire correspond à l'
name
attribut html , (et le widget doit probablement correspondre également au type d'entrée) Django exécutera tous les mêmes validateurs sur ce champ lorsque vous exécutezvalidate
ouform.is_valid()
etLe style d'autres éléments tels que les étiquettes, les messages d'erreur et le texte d'aide ne nécessite pas beaucoup de solution de contournement, car vous pouvez faire quelque chose comme
form.field.error.as_text
et les styliser comme vous le souhaitez. Les champs réels sont ceux qui nécessitent quelques manipulations.Je ne sais pas si c'est le meilleur moyen ou celui que je recommanderais, mais c'est un moyen, et cela pourrait convenir à quelqu'un.
Voici une procédure pas à pas utile des formulaires de style et elle comprend la plupart des réponses répertoriées sur SO (comme l'utilisation de l'attr sur les widgets et les ajustements de widgets). https://simpleisbetterthancomplex.com/article/2017/08/19/how-to-render-django-form-manually.html
la source
Styliser les instances de widget
Si vous souhaitez rendre une instance de widget différente d'une autre, vous devrez spécifier des attributs supplémentaires au moment où l'objet widget est instancié et assigné à un champ de formulaire (et peut-être ajouter des règles à vos fichiers CSS).
https://docs.djangoproject.com/en/2.2/ref/forms/widgets/
Pour ce faire, vous utilisez l'argument Widget.attrs lors de la création du widget:
Vous pouvez également modifier un widget dans la définition du formulaire:
Ou si le champ n'est pas déclaré directement sur le formulaire (comme les champs de formulaire de modèle), vous pouvez utiliser l'attribut Form.fields:
Django inclura alors les attributs supplémentaires dans la sortie rendue:
la source