8
votes

Référencer un nombre dynamique de champs dans un modèle de Django

C'est tout très simple. J'ai ce formulaire:

{% for unit in selected_subunits %}
  {{ form.su%s }} % (unit.unit__id)
{% endfor %}


0 commentaires

3 Réponses :


4
votes

Groupe de ces champs dans une liste supplémentaire, puis simplement itérer sur cette liste.

in __ init __ : xxx

dans le modèle: < / p> xxx


10 commentaires

+1: La meilleure solution n'est pas de mettre cela dans le modèle, car ce n'est pas une logique de modèle.


Qu'est-ce que j'écris à l'intérieur de la boucle pour montrer le champ de saisie? Il me semble que j'ai toujours le problème de référencer chaque nom de terrain "inconnu" dans la boucle, par exemple. ceci {{champ.su% s}}% (unité.unit__id)


Et si je viens d'écrire {{champ}} i, je reçois cela comme sortie:


Je pense que la réponse pour moi doit utiliser des constructeurs automobiles, peut-être.


Killiands: Comment le feriez-vous alors? Je suis très nouveau à Django, donc je ne suis pas aussi bien versé dans la logique du modèle que vous êtes.


@Brian: essayez {{field.render}} . Sinon, je vais chercher un peu plus.


@GruszCzy: J'ai rencontré exactement le même problème.


Je peux accéder au champ.Label. Mais en essayant {{champ}}, il a échoué.


Pour avoir le code ci-dessus, changez self.subunit_list.append (champ) pour self.subunit_list.append (auto% d '% (Subunit [Unité__id'])] )


@Brian, la réponse de ROM corrige votre problème. Ajouter auto ['Field_Name'] à votre liste par opposition à l'objet de terrain créé par le constructeur Integerfield ().



8
votes

Pour accéder aux instances de champ limite pour vos instances de champ dynamiques, ce qui vous donne accès à Tous les attributs et méthodes nécessaires pour rendre le champ , vous devez accéder aux objets de champ à l'aide du formulaire de form.fieldname < / Code> plutôt que form.fields [FieldName]

Voici un refactorisation potentiel de votre classe de formulaire: xxx

puis dans votre modèle, Vous devriez être capable de parcourir les champs comme vous l'attendez normalement en accédant à form.su_fields : xxx

(je me suis battu avec ce même Problème Pendant plusieurs heures. Merci à Cette réponse de Carl Meyer et Cet artic Le sur la génération de formulaire dynamique de Jacob Kaplan-Moss pour me diriger dans les bonnes directions.)


1 commentaires

Merci beaucoup pour cela! J'ai eu du mal sur un projet de passe-temps personnel pendant un mois parce que je ne pouvais pas obtenir mon formulaire bien sûr. Je me sentais vraiment en bas parce que je pensais que c'était quelque chose qui devrait juste travailler mais ne pouvait pas vraiment obtenir l'incantation correcte. Vous m'avez aidé immensément.



1
votes

Pour corriger la réponse de Gruszczy, ce code a fonctionné pour moi:

dans __ init __ de votre formulaire: xxx

dans votre modèle: < / p> xxx


0 commentaires