Formulaires Django: comment créer dynamiquement des libellés ModelChoiceField

Je voudrais créer des étiquettes dynamiques pour une formes.ModelChoiceField et je me demandais comment faire. J'ai le formulaire ci-dessous classe:

class ProfileForm(forms.ModelForm):

    def __init__(self, data=None, ..., language_code='en', family_name_label='Family name', horoscope_label='Horoscope type', *args, **kwargs):
        super(ProfileForm, self).__init__(data, *args, **kwargs)

        self.fields['family_name'].label = family_name_label
        .
        .
        self.fields['horoscope'].label = horoscope_label
        self.fields['horoscope'].queryset = Horoscope.objects.all()

    class Meta:
        model = Profile

    family_name = forms.CharField(widget=forms.TextInput(attrs={'size':'80', 'class': 'contact_form'}))
    .
    .
    horoscope = forms.ModelChoiceField(queryset = Horoscope.objects.none(), widget=forms.RadioSelect(), empty_label=None)

Les étiquettes par défaut sont définis par la unicode fonction spécifiée dans la définition de Profil. Cependant, les étiquettes pour les boutons radio créée par la ModelChoiceField besoin d'être créé dynamiquement.

J'ai d'abord pensé que je pourrais simplement les remplacer ModelChoiceField comme décrit dans la documentation de Django. Mais qui crée de la statique des étiquettes. Il permet de définir une étiquette, mais une fois que le choix est fait, ce choix s'est fixé.

Donc je pense que j'ai besoin pour s'adapter ajouter quelque chose à init comme:

class ProfileForm(forms.ModelForm):

    def __init__(self, data=None, ..., language_code='en', family_name_label='Family name', horoscope_label='Horoscope type', *args, **kwargs):
        super(ProfileForm, self).__init__(data, *args, **kwargs)

        self.fields['family_name'].label = family_name_label
        .
        .
        self.fields['horoscope'].label = horoscope_label
        self.fields['horoscope'].queryset = Horoscope.objects.all()
        self.fields['horoscope'].<WHAT>??? = ???

Toute personne ayant aucune idée de comment gérer cela? Toute aide serait très apprécié.


J'ai trouvé quelque chose mais je ne sais pas si c'est la meilleure solution. - Je ajouter quelque chose à la init partie de la classe ProfileForm comme suit:

class ProfileForm((forms.ModelForm):

    def __init__(self, data=None, ..., language_code='en', family_name_label='Family name', horoscope_label='Horoscope type', *args, **kwargs):
    super(ProfileForm, self).__init__(data, *args, **kwargs)

        # this function is added
        def get_label(self, language_code):
            """
            returns the label in the designated language, from a related object (table)
            """
            return HoroscopeLanguage.objects.get(horoscope=obj, language__language_code=language_code).horoscope_type_language

        self.fields['family_name'].label = family_name_label
        .
        .
        self.fields['horoscope'].queryset = Horoscope.objects.all()
        self.fields['horoscope'].label_from_instance = lambda obj: "%s: Euro %.2f" % (HoroscopeLanguage.objects.get(horoscope=obj, language__language_code=language_code).horoscope_type_language, obj.price)
        .
        .
        """
        The next code also works, the lambda function without the get_label function
        """
        self.fields['horoscope'].label_from_instance = lambda obj: "%s: Euro %.2f" % (obj.horoscope_type, obj.price)
        .
        .
        """
        But this code doesn't work. Anyone?
        """
        self.fields['horoscope'].label_from_instance = get_label(obj, language_code)

source d'informationauteur Henri | 2010-06-02