Je crée une forme Django avec un ensemble de boutons radio (comme un seul champ de radiosyle), et j'aimerais avoir certains em> des boutons grisés. Toutefois, étant donné que le champ Radioselect est un champ Single em> sur le formulaire, je n'ai pas trouvé de moyen de le faire. class OrderStatusForm(forms.Form):
os = Order_Status.objects.values_list('id', 'status')
status = forms.ChoiceField(choices=os, widget=forms.RadioSelect())
def makeForm():
newForm = OrderStatusForm()
# next line disables all radio buttons.
newForm.fields['status'].widget.attrs['disabled'] = True
3 Réponses :
Peut-être essayer: ou p>
Ce n'est pas différent de ce que j'ai posté - Statut code> est considéré comme un champ unique i> (avec plusieurs boutons radio), et tout est désactivé. Il suffit de déplacer le code sur init i> ne change pas ce que cela affecte.
Vous pouvez le faire dans le modèle avec JavaScript, avec quelque chose comme ceci: supposant que vous avez JQuery (pour le $ code>) et < Code> Désactiver code> (dans le
{% pour%} code> boucle) est une variable que vous passez au modèle, qui évalue la liste des valeurs que vous souhaitez griser. p> p>
Merci, c'est une approche intéressante. Ce n'est pas clair pour moi comment je voudrais référence i> chaque champ - indice? Ou django attribue-t-il un nom par défaut? (Aussi, je commence le site sans JS et l'ajoutera éventuellement, car j'identifie les domaines d'utilisation optimale).
La partie "Entrée [nom =" "] '' '' '' '' va trouver tous vos champs, appelé statut, comme dans le formulaire. La pièce '[valse = "{{val}}"]' '' '' choisira un bouton radio particulier. Combiné avec la boucle pour la boucle, vous finissez par désactiver tous les champs obligatoires. Le nom par défaut est le nom du champ - 'Statut'.
Vous devrez toujours vérifier le côté serveur de son, car quelqu'un pourrait simplement modifier le HTML.
Des recherches supplémentaires ont abouti au fait que le radiosélectionnez Le rendu Ajoute un attribut désactivé em> à chaque widget de bouton radio si nécessaire, alors le forcer_unicode em> transforme les attributs du widget en HTML qui incluent un rendu code> peut être remplacé em> et transmis sous forme de paramètre sur la fonction de création de widget initiale. J'ai donc créé mon propre rendu et joint une liste de booléens, indiquant quelles boutons radio doivent être désactivées.
désactivé = "true" code> valeur. p>
from django.utils.safestring import mark_safe
from django.utils.encoding import force_unicode
class RandomRenderer(forms.RadioSelect.renderer):
""" Modifies some of the Radio buttons to be disabled in HTML,
based on an externally-appended Actives list. """
def render(self):
if not hasattr(self, "actives"): # oops, forgot to add an Actives list
return self.original_render()
return self.my_render()
def original_render(self):
return mark_safe(u'<ul>\n%s\n</ul>' % u'\n'.join([u'<li>%s</li>'
% force_unicode(w) for w in self]))
def my_render(self):
midList = []
for x, wid in enumerate(self):
if self.actives[x] == False:
wid.attrs['disabled'] = True
midList.append(u'<li>%s</li>' % force_unicode(wid))
finalList = mark_safe(u'<ul>\n%s\n</ul>' % u'\n'.join([u'<li>%s</li>'
% w for w in midList]))
return finalList
class OrderStatusForm(forms.Form):
os = Order_Status.objects.values_list('id', 'status', 'reason')
activeList = [True, False, True, False, True, False,]
newStatus = forms.ChoiceField(widget=forms.RadioSelect(
renderer=RandomRenderer), choices=os)
newStatus.widget.renderer.actives = activeList
Une manière plus simple serait de remplacer la méthode create_option code> de
formulaires.radiosélectionnez code> et ajoutez
attrs ['désactivé'] = true code> si nécessaire, avant d'appeler la super-méthode.