88 votes

Formulaire Django - set label

J'ai un formulaire qui hérite de 2 autres formulaires. Dans mon formulaire, je souhaite modifier le libellé d'un champ défini dans l'un des formulaires parents. Est-ce que quelqu'un sait comment cela peut être fait?

J'essaie de le faire dans mes __init__ , mais cela génère une erreur disant que "l'objet 'RegistrationFormTOS' n'a pas d'attribut 'email'". Est-ce que quelqu'un sait comment je peux faire ça?

Merci.

Voici mon code de formulaire:

 from django import forms
from django.utils.translation import ugettext_lazy as _
from registration.forms import RegistrationFormUniqueEmail
from registration.forms import RegistrationFormTermsOfService

attrs_dict = { 'class': 'required' }

class RegistrationFormTOS(RegistrationFormUniqueEmail, RegistrationFormTermsOfService):
    """
    Subclass of ``RegistrationForm`` which adds a required checkbox
    for agreeing to a site's Terms of Service.

    """
    email2 = forms.EmailField(widget=forms.TextInput(attrs=dict(attrs_dict, maxlength=75)), label=_(u'verify email address'))

    def __init__(self, *args, **kwargs):
    	self.email.label = "New Email Label"
    	super(RegistrationFormTOS, self).__init__(*args, **kwargs)

    def clean_email2(self):
    	"""
    	Verifiy that the values entered into the two email fields
    	match. 
    	"""
    	if 'email' in self.cleaned_data and 'email2' in self.cleaned_data:
    		if self.cleaned_data['email'] != self.cleaned_data['email2']:
    			raise forms.ValidationError(_(u'You must type the same email each time'))
    	return self.cleaned_data
 

164voto

Xbito Points 755

Tu devrais utiliser:

 def __init__(self, *args, **kwargs):
    super(RegistrationFormTOS, self).__init__(*args, **kwargs)
    self.fields['email'].label = "New Email Label"
 

Notez d'abord que vous devriez utiliser le super appel.

23voto

kiennt Points 121

Vous pouvez définir label en tant qu'attribut de champ lorsque vous définissez un formulaire.

 class GiftCardForm(forms.ModelForm):
    card_name = forms.CharField(max_length=100, label="Cardholder Name")
    card_number = forms.CharField(max_length=50, label="Card Number")
    card_code = forms.CharField(max_length=20, label="Security Code")
    card_expirate_time = forms.CharField(max_length=100, label="Expiration (MM/YYYY)")

    class Meta:
        model = models.GiftCard
        exclude = ('price', )
 

9voto

Matthew Marshall Points 2521

Vous accédez aux champs d'un formulaire via le dict 'field':

 self.fields['email'].label = "New Email Label"
 

C'est pour que vous n'ayez pas à vous soucier des champs de formulaire ayant des conflits de nom avec les méthodes de classe de formulaire. (Sinon, vous ne pourriez pas avoir un champ nommé 'clean' ou 'is_valid') La définition des champs directement dans le corps de la classe est généralement une simple commodité.

2voto

Bender-51 Points 19

Cela ne fonctionne pas pour l'héritage de modèle, mais vous pouvez définir l'étiquette directement dans le modèle.

 email = models.EmailField("E-Mail Address")
email_confirmation = models.EmailField("Please repeat")
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X