12
votes

Formulaires Django: Comment créer de manière dynamique des étiquettes de modèleChoiceField

Je voudrais créer des étiquettes dynamiques pour un formulaire.Modelchoicefield et je me demande comment faire cela. J'ai la classe de formulaire suivante: xxx

Les étiquettes par défaut sont définies par la fonction unicode spécifiée dans la définition de profil. Cependant, les étiquettes des boutons radio créées par le modèleChoicefield doivent être créées de manière dynamique.

Je pensais que je pouvais simplement remplacer le modèleChoicefield tel que décrit dans la documentation Django. Mais cela crée des étiquettes statiques. Il vous permet de définir n'importe quelle étiquette, mais une fois que le choix est effectué, ce choix est corrigé.

Donc, je pense que je dois adapter quelque chose à init comme: XXX

Quelqu'un ayant une idée de la façon de gérer cela? Toute aide serait très appréciée.


J'ai trouvé quelque chose mais je ne sais pas si c'est la meilleure solution. J'ajoute quelque chose à la partie init de formes de classe comme suit: xxx


1 commentaires

Voulez-vous dire "les étiquettes par défaut sont définies dans la fonction unicode spécifiée dans la définition horoscope "?


3 Réponses :


9
votes

Vous pouvez utiliser un ModelChoicefield , puis modifiez les choix en vous ProfileForm .__ init __ de manière dynamique, par exemple (en supposant qu'il s'agit déjà d'un modèle de modèle): xxx < / Pré>

H.Name Dans cet exemple sera utilisé comme étiquette du choix!


3 commentaires

Lorsque j'essaie votre solution, j'arrête d'avoir une erreur: "Sélectionnez un choix valide. Ce choix n'est pas l'un des choix disponibles." J'ai bien peur que votre solution ne fonctionne pas. Fondamentalement, le profil de modèle a défini un horoscope à clé étranger et une instance de profil s'attend à une instance de l'horoscope modèle, pas seulement un entier H.PK.


Oui, je voulais dire "les étiquettes par défaut sont définies dans la fonction Unicode spécifiée dans la définition d'horoscope"


Désolé, je me suis heurté à quelque chose ici, cela fonctionnerait probablement avec un champ de choix normal, mais voyez mon autre solution avec sous-classement le modèleChoicefield!



7
votes

Vous pouvez créer votre propre classe de champ de formulaire et écraser la méthode qui génère l'étiquette: xxx pré>

Utilisez-le sous votre forme identique que vous l'avez fait avec le modèleChoicefield: P>

horoscope = MyChoiceField(queryset = .....)


1 commentaires

Oui et c'est aussi ce que j'ai écrit dans ma question initiale. Cela crée des étiquettes alternatives mais des étiquettes statiques. Voir ma remarque qui se lit "Tout d'abord, je pensais pouvoir simplement remplacer le modèleChoicefield comme décrit dans la documentation de Django ..."



3
votes

En réalité, le dernier exemple de code contient des erreurs d'un devoir:

# this function is added
def get_label(obj):
    return '%s: Euro %.2f' % (HoroscopeLanguage.objects.get(horoscope=obj, language__language_code=language_code).horoscope_type_language, obj.price)
.
.
.

self.fields['horoscope'].label_from_instance = get_labels


0 commentaires