8
votes

Personnalisation des formulaires Django avec Widget Radioselect

Donc, j'utilise jQuery ui à peau des boutons radio mais je ne peux pas Get Django pour rendre ma forme comme ça doit être fait.

J'ai besoin d'avoir cette structure: xxx

afin de résumer que j'ai besoin des boutons radio dans un Classe (radio) où ils ont une entrée et une étiquette pour .

Lorsque je rends le formulaire dans mon modèle avec {{profil_form .notify_new_friends}} Je reçois ce qui suit: xxx

ce que je veux exactement ce que je veux, à l'exception de la partie. J'ai donc essayé de boucler sur celui-ci qui me donne les étiquettes formatées différemment: xxx

qui me donne: xxx

donc le problème ici est que cela s'arrête en utilisant l'étiquette pour et démarre à l'aide d'une étiquette sur wwapper tout avec.

J'ai aussi essayé de faire quelque chose comme ça, mais alors l'étiquette et label_tag Ne rendant pas quelque chose. xxx

alors quelqu'un sait comment je peux Rendez-le correctement!?

fyi, ceci est mes formulaires.py: xxx


4 commentaires

docs.djangoproject.com/fr/dev/ref/forms/widgets / # Radioselect - Avez-vous lu ceci?


@ Alexandera.sosnovskiy oui, mais j'avais manqué le Choice_Label pour obtenir le titre d'étiquette, mais malheureusement faire {{radio.tag}} ne me fournit pas d'identité et Par conséquent, je ne peux pas faire étiquette pour que je dois faire.


Les identifiants de champ sont générés automatiquement, {{champ.auto_id}}


@Argskwargs J'aurais peut-être mal compris comment l'utiliser, mais non, cela ne me donne rien de rendu.


5 Réponses :


1
votes

Comme il ne semble pas être un bon moyen de le faire, j'ai choisi de réorganiser le code généré à l'aide de jQuery.

<input type="radio" id="id_notify_new_friends_0" value="0" name="notify_new_friends" /><label for="id_notify_new_friends_0"> Immediately</label></li>
<input type="radio" id="id_notify_new_friends_1" value="1" name="notify_new_friends" /><label for="id_notify_new_friends_1"> Never</label></li>


2 commentaires

Je pense que s'il y a des possibilités de le faire sans JavaScript, nous devrions éviter JS ... surtout à la page Loading - Pire performance, pire référencement. Si nous utilisons JavaScript pour la manipulation, il devrait s'agir de la manipulation dynamique qui cause une raison comme une interaction.


Je ne crois pas qu'un javascript qui réorganise simplement le même contenu sur la page est susceptible d'affecter le référencement. Cela de côté, cette solution fonctionne très bien dans l'administrateur Django, où le référencement est non pertinent et le contrôle de la sortie HTML nécessiterait de remplacer plusieurs classes Django mentionnées dans la réponse de TNNJDEK.



10
votes

Dans mon code, j'ai découvert que la modification du widget de xxx pré>

à p> xxx pré>

provoque magiquement la balise résultante Code> Valeur Pour inclure l'attribut ID code> avec l'index de l'élément ajouté. Si vous utilisez p> xxx pré>

dans le formulaire, vous obtenez un étiquette code> enveloppé autour d'une entrée code>. Si vous souhaitez l'entrée code> classique code> suivie de étiquette code>, vous devez le faire: p>

{% for radio in form.value %}
    <li>
        {{ radio.tag }}
        <label for="value_{{ forloop.counter0 }}">{{ radio.choice_label }}</label>
    </li>
{% endfor %}


0 commentaires

0
votes
Try like this ,  I got it..

from django.forms.widgets import RadioFieldRenderer
from django.utils.encoding import force_unicode
from django.utils.safestring import mark_safe


class RadioCustomRenderer( RadioFieldRenderer ):
    def render( self ):
        return  mark_safe(u'%s' % u'\n'.join([u'%s'  % force_unicode(w) for w in self]))

in form

widgets = {
            'validity': forms.RadioSelect(renderer=RadioCustomRenderer),
        }

0 commentaires

3
votes

Malheureusement, il est plus compliqué qu'il ne devrait l'être, il semble que vous ayez besoin de remplacer au moins 2 classes: radiorenderer code> et radioinpon code>. Ce qui suit devrait vous aider à démarrer, mais vous pourriez avoir besoin de le modifier un peu.

Créez d'abord un widget d'entrée de bouton radio personnalisé. Le seul but de nous remplacer la méthode de rendu est de se débarrasser de la structure gênante Django applique (

maintenant nous devons remplacer radiorenderer code> afin de: p>

  1. force-le à utiliser notre widget d'entrée radio personnalisé LI>
  2. Supprimer
  3. code> Envelopper chaque champ d'entrée et
      code> Tout emballage de saisie: li> ol>

      Quelque chose le long de ces lignes devrait faire: p>

    <table>
      <tr>
        <td><label for="{{field.auto_id}}">{{field.label}}</label></td>
        <td>{{ field.errors }} {{field}}</td>
      </tr>
    </table>
    


1 commentaires

Je suis d'accord, la documentation pour cela manque d'OMI. Et pendant que je suis d'accord avec la majeure partie de la documentation Django, des exemples de formulaires HTML utilisant la coque ne sont pas la meilleure approche.



2
votes

Si quelqu'un trébuche sur ce problème et que vous voulez simplement rendre le bouton radio sans UL: ils devraient suivre ce lien.

https://docs.djangoproject.com/fr/3.1/ref/Forms/widgets/#selector-widgets P>

Exemple ci-dessous. P>

{% for radio in myform.beatles %}
    <div class="myradio">
    {{ radio }}
    </div>
{% endfor %}


1 commentaires

Enfin, j'ai trouvé la réponse! Merci.