Le style CSS dans Django formes
Je voudrais style suivantes:
forms.py:
from django import forms
class ContactForm(forms.Form):
subject = forms.CharField(max_length=100)
email = forms.EmailField(required=False)
message = forms.CharField(widget=forms.Textarea)
contact_form.html:
<form action="" method="post">
<table>
{{ form.as_table }}
</table>
<input type="submit" value="Submit">
</form>
Par exemple, comment puis-je configurer un classe ou ID pour la subject
, email
, message
de fournir une feuille de style externe pour?
Vous devez vous connecter pour publier un commentaire.
Pris de ma réponse:
Comment balisage des champs de formulaire avec des <div class='type_champ" > dans Django
ou
ou
--- EDIT ---
Le ci-dessus est le changement le plus simple à faire à la question d'origine du code qui accomplit ce qui a été demandé. Il vous permet également de vous répéter, si vous réutilisez le formulaire dans d'autres endroits; vos classes ou d'autres attributs d'un travail juste si vous utilisez le Django as_table/as_ul/as_p méthodes de formulaire. Si vous avez besoin d'un contrôle total pour un complètement personnalisée de rendu, c'est clairement documentées
-- EDIT 2 ---
Ajout d'une nouvelle méthode pour spécifier widget et attrs pour un ModelForm.
id
. Deuxième à son habitude le modèle côté du responsobilty à faire exactement cela, Avec si vous allez accéder à cette classe via le frontend méthodes (js, css). Je n'ai pas dit que votre réponse est fausse. À mon avis sa viens d'une mauvaise pratique (avec quand votre travail en équipe avec frontend et backend développeurs).Cela peut être fait à l'aide d'un modèle personnalisé de filtre. Envisager le rendu de votre formulaire de cette façon:
form.subject
est une instance deBoundField
qui a leas_widget()
méthode.Vous pouvez créer un filtre personnalisé
addclass
dans my_app/templatetags/myfilters.py:Et appliquez ensuite votre filtre:
form.subjects
sera ensuite rendu à laMyClass
classe CSS.{{ form.subject|addclass:'myclass1 myclass2' }}
Si vous ne voulez pas ajouter de tout code pour le formulaire (comme mentionné dans les commentaires de @shadfc de Réponse), il est certainement possible, voici deux options.
Tout d'abord, vous venez de référence les domaines individuellement dans le code HTML, plutôt que l'ensemble de la forme à la fois:
(À noter que j'ai aussi changé d'un non triés liste.)
Deuxième, remarque dans les docs sur la sortie des formulaires HTML, Django:
Tous vos champs de formulaire ont déjà un unique id. Donc vous l'référence id_subject dans votre fichier CSS pour le style de la sujet champ. Je tiens à souligner, c'est la façon dont la forme se comporte lorsque vous prenez le par défaut HTML, ce qui nécessite juste l'impression de la forme, pas les champs individuels:
Voir le lien précédent pour d'autres options lors de la sortie de formes (vous pouvez le faire tableaux, etc).
Remarque - je me rends compte que ce n'est pas le même que l'ajout d'un classe à chaque élément (si vous avez ajouté un champ dans le Formulaire, vous aurez besoin de mettre à jour le CSS aussi) - mais il est assez facile de faire référence à tous les champs par id dans votre CSS, comme ceci:
Vous pouvez le faire comme ceci:
Espère que fonctionne.
Ignasi
Par cette blog, vous pouvez ajouter des classes css pour vos champs à l'aide d'un modèle personnalisé filtre.
Vous pouvez utiliser cette bibliothèque: https://pypi.python.org/pypi/django-widget-tweaks
Il vous permet d'effectuer les opérations suivantes:
render_field
.Que vous pouvez faire:
Ensuite, vous pouvez ajouter des classes/id, par exemple, la
<td>
tag. Vous pouvez bien sûr utiliser d'autres balises que vous souhaitez. Vérifier Travailler avec Django formes comme un exemple de ce qui est disponible pour chaquefield
dans la forme ({{field}}
, par exemple, est juste à la sortie de la balise d'entrée, pas l'étiquette et ainsi de suite).Ne vois pas cela vraiment...
https://docs.djangoproject.com/en/1.8/ref/forms/api/#more-granular-output
Plus granulaire de sortie
La as_p(), as_ul() et as_table() méthodes sont tout simplement des raccourcis pour les paresseux développeurs – ils ne sont pas la seule façon d'une forme de l'objet peut être affiché.
classe BoundField
Utilisé pour afficher le code HTML ou les attributs d'accès pour un seul champ d'une instance de Formulaire.
La str() (unicode sur Python 2) la méthode de cet objet affiche le code HTML de ce champ.
Pour récupérer une seule BoundField, utiliser la recherche dans le dictionnaire de la syntaxe sur votre formulaire à l'aide du champ le nom de la clé:
Pour récupérer tous les BoundField objets, de réitérer la forme:
Le domaine spécifique de la sortie d'honneurs de la forme de l'objet auto_id réglage:
Vous ne pouvez pas besoin de remplacer votre formulaire de la classe de
__init__
, parce que Django jeux dename
&id
attributs dans le code HTMLinput
s. Vous pouvez avoir CSS comme ceci:id
champ créé par Django pour formsets devient assez poilue...Une solution est d'utiliser JavaScript pour ajouter l'classes CSS une fois que la page est prête. Par exemple, le style de django forme de sortie avec bootstrap classes (jQuery utilisé par souci de concision):
Cela évite la laideur de mélange de style détails avec votre logique métier.
Il est très facile à installer et grand outil fait pour Django que j'utilise pour le style et il peut être utilisé pour chaque interface framework comme Bootstrap, se Matérialiser, Fondation, etc. Il est appelé widget-réglages de la Documentation: Widget Réglages
de django formulaires d'importation
Au lieu d'utiliser par défaut:
Vous pouvez le modifier à votre guise à l'aide de la render_field attribut qui vous donne un plus html-comme la manière de style comme dans cet exemple:
template.html
Cette bibliothèque vous donne la possibilité d'avoir bien séparés yout extrémité avant à partir de votre backend
Dans Django 1.10 (peut-être plus tôt que bien), vous pouvez le faire comme suit.
Modèle:
Forme:
Modèle:
Edit: un Autre (un peu mieux) façon de faire que je suggère, c'est la réponse ici: Django champ de saisie style
Toutes les options ci-dessus génial, juste pensé que je le jeter dans parce que c'est différent.
Si vous voulez le style personnalisé, des cours, etc. sur vos formulaires, vous pouvez faire une entrée html de votre modèle qui correspond à votre champ de formulaire. Pour un CharField, par exemple, (widget par défaut est
TextInput
), disons que vous voulez un bootstrap à la recherche d'entrée de texte. Vous faites quelque chose comme cela:<input type="text" class="form-control" name="form_field_name_here">
Et aussi longtemps que vous mettez le nom de champ correspond à l'html
name
attribut n', (et le widget doit probablement correspondre au type d'entrée ainsi) Django fonctionnera tout de même validateurs sur le champ lorsque vous exécutezvalidate
ouform.is_valid()
etStyle d'autres choses comme les labels, les messages d'erreur, et le texte de l'aide ne requièrent pas beaucoup de solution, parce que vous pouvez faire quelque chose comme
form.field.error.as_text
et le style comme vous le souhaitez. La réelle champs sont ceux qui nécessitent d'origine.Je ne sais pas si c'est la meilleure façon, ou la façon dont je le recommande, mais c'est une façon, et il pourrait être bon pour quelqu'un.
Voici un bon de procédure pas à pas de style, et qui comprend la plupart des réponses répertoriées sur SI (comme l'utilisation de l'attribut sur les widgets et le widget réglages).
https://simpleisbetterthancomplex.com/article/2017/08/19/how-to-render-django-form-manually.html
Style widget instances
Si vous voulez faire un widget exemple un aspect différent de l'autre, vous aurez besoin de spécifier des attributs supplémentaires au moment où le widget de l'objet est instancié et assigné à un champ de formulaire (et peut-être ajouter quelques règles à vos fichiers CSS).
https://docs.djangoproject.com/en/2.2/ref/forms/widgets/
Pour ce faire, vous utilisez le Widget.attrs argument 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 la forme (tels que le modèle de champs de formulaire), vous pouvez utiliser le Formulaire.les champs d'attribut:
Django sera alors inclure des attributs supplémentaires dans le rendu de sortie: