J'ai décidé d'essayer Bootstrap 3 ce soir pour la première fois. J'ai remarqué que, pour obtenir le joli style de champ de formulaire par défaut, vous devez ajouter un form-control
classe à chaque entrée, zone de texte, sélection, etc. Ceci est pénible pour ceux qui génèrent dynamiquement leurs formulaires (par exemple, en utilisant Django). Django vous permet de définir les attributs des champs de formulaire, mais pour le faire globalement, il faudrait un correctif de singe méchant ou bien un code très non DRY.
Vous devriez vraiment vérifier une application Django qui rend tous vos formulaires Django comme des formulaires Nice Boostrap), simplement en utilisant une balise dans votre modèle.
Son nom est Django-bootstrap . Voici comment vous l'utilisez:
Ajouter bootstrap3
à ton INSTALLED_APPS
:
INSTALLED_APPS = (
...
'bootstrap3',
...
)
Mettez à jour votre modèle:
bootstrap3
{{form.as_p}}
à {% bootstrap3_form form %}
avant:
<form method="post" class="form-horizontal" action="" >
<div class="hidden-desktop">
<button type="submit" class="btn btn-primary"> Save</button>
</div>
{% csrf_token %}
{{ form.as_p }}
<div class="actions form-actions">
<button type="submit" class="btn btn-primary"> Save</button>
</div>
</form>
après:
{% extends "base.html" %}
{% load bootstrap3 %}
<form method="post" class="form-horizontal" action="" >
<div class="hidden-desktop">
<button type="submit" class="btn btn-primary">{% bootstrap_icon "ok" %} Save</button>
</div>
{% csrf_token %}
{% bootstrap_form form %}
<div class="actions form-actions">
<button type="submit" class="btn btn-primary">{% bootstrap_icon "ok" %} Save</button>
</div>
Rien d'autre a faire. Rien à mettre à jour dans votre formulaire. Aucun piratage JavaScript.
Je me demandais pourquoi la réponse ci-dessous avait obtenu des votes négatifs en premier. J'ai trouvé ma réponse au sujet du form-group
À la place de la classe form-control
. La classe form-control
Ajoute de nombreuses règles CSS.
Vous devez essayer de contrôler la sortie de votre formulaire en premier lieu: https://stackoverflow.com/a/8474452/1596547
Si vous ne pouvez pas, vous pouvez essayer la même chose que ci-dessous. Appliquez les mêmes règles sur vos entrées au lieu de form-control
, Comme:
input {
display: block;
width: 100%;
height: 34px;
padding: 6px 12px;
font-size: 14px;
line-height: 1.428571429;
color: #555555;
vertical-align: middle;
background-color: #ffffff;
border: 1px solid #cccccc;
border-radius: 4px;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
}
input:focus {
border-color: #66afe9;
outline: 0;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);
}
Avec MOINS> 1.4, vous pouvez utiliser :extend()
, voir: https://stackoverflow.com/a/15573240/1596547 . Vous pouvez l'utiliser pour ce qui précède en ajoutant une règle à vos fichiers less:
input {
&:extend(.form-control all);
}
Voir aussi: Pourquoi donne Grunt/Recess une erreur et Lessc pas lors de la compilation Bootstrap 3 RC1?
Le form-group
Est un conteneur-div autour de vos constructions d'entrée/étiquette, il n'ajoute qu'un margin-bottom: 15px;
. Vous pouvez créer vos formulaires sans lui. Pour cette raison, ce n'est pas obligatoire.
Avec css, vous pouvez faire quelques contournements. Je ne pense pas que vous puissiez toujours éviter Javascript. Je ne connais pas la structure HTML de vos formulaires Django. J'ai utilisé l'exemple de formulaire de http://getbootstrap.com/css/#forms et supprimer les conteneurs form-control
. Ensuite, je "corrige" les différences. REMARQUE: j'ajoute également une balise <br>
devant le bouton d'envoi.
Voir: http://bootply.com/7337
1) form-group
Ajoute un margin-bottom: 15px;
Pour résoudre ce problème, j'ajoute cette marge aux balises d'entrée:
input { margin-bottom: 15px; }
Cela fonctionne accepter pour la case à cocher (et la radio). Le CSS Bootstrap définit input[type="radio"], input[type="checkbox"] { line-height: normal; margin: 4px 0 0; }
Qui annule (causé par la spécificité CSS, voir: http://coding.smashingmagazine.com/2007/07/27/css) -specificity-things-you-should-know / ) le CSS pour l'entrée ci-dessus.
La règle finale sera donc:
input, input[type="checkbox"] { margin-bottom: 15px; }
2) l'étiquette de la case à cocher diffère également. REMARQUE la case à cocher n'a pas de classe form-control
Mais une classe checkbox
à la place. Les règles CSS pour le texte de l'étiquette sont: .radio label, .checkbox label { cursor: pointer; display: inline; font-weight: normal; margin-bottom: 0; }
Dans ce cas, vous ne pouvez pas utiliser uniquement CSS (l'étiquette est un parent de la case à cocher d'entrée, et il n'y a pas de sélecteur de parent en CSS, voir: Existe-t-il un sélecteur parent CSS? ). Avec jQuery, vous pouvez sélectionner l'étiquette et ajouter une classe:
$('input[type="checkbox"]').parent("label").addClass('checkboxlabel');
Ajoutez maintenant cette classe à votre CSS avec les mêmes règles que le .checkbox label
:
.checkboxlabel { cursor: pointer; display: inline; font-weight: normal; margin-bottom: 0; }
Maintenant, les deux formes ont la même apparence, je pense:
Lisez aussi: Django Forms et Bootstrap - classes CSS et <divs>
Une chose que j'ai faite a été de créer un mixin qui ajoute le form-control
classe à chaque widget.
class BootStrap3FormControlMixin(object):
def __init__(self, *args, **kwargs):
super(BootStrap3FormControlMixin, self).__init__(*args, **kwargs)
for field in self.fields.values():
_class = field.widget.attrs.get('class', '')
field.widget.attrs.update({'class': u'%s %s' % (_class, 'form-control',)})