6
votes

Comment créer une forme Django avec un champ Radioselect et certains boutons désactivés?

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


0 commentaires

3 Réponses :


1
votes

Peut-être essayer: xxx

ou xxx


1 commentaires

Ce n'est pas différent de ce que j'ai posté - Statut est considéré comme un champ unique (avec plusieurs boutons radio), et tout est désactivé. Il suffit de déplacer le code sur init ne change pas ce que cela affecte.



0
votes

Vous pouvez le faire dans le modèle avec JavaScript, avec quelque chose comme ceci: xxx

supposant que vous avez JQuery (pour le $ ) et < Code> Désactiver (dans le {% pour%} boucle) est une variable que vous passez au modèle, qui évalue la liste des valeurs que vous souhaitez griser.


3 commentaires

Merci, c'est une approche intéressante. Ce n'est pas clair pour moi comment je voudrais référence 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.



9
votes

Des recherches supplémentaires ont abouti au fait que le radiosélectionnez 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.

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 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


1 commentaires

Une manière plus simple serait de remplacer la méthode create_option de formulaires.radiosélectionnez et ajoutez attrs ['désactivé'] = true si nécessaire, avant d'appeler la super-méthode.