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'essaye de le faire dans mon __init__
, mais il génère une erreur indiquant 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
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 devez utiliser le super appel.
Voici un exemple tiré de remplacement des champs par défaut :
from Django.utils.translation import ugettext_lazy as _ class AuthorForm(ModelForm): class Meta: model = Author fields = ('name', 'title', 'birth_date') labels = { 'name': _('Writer'), } help_texts = { 'name': _('Some useful help text.'), } error_messages = { 'name': { 'max_length': _("This writer's name is too long."), }, }
Vous pouvez définir label
comme attribut de champ lorsque vous définissez le 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', )
Vous accédez aux champs d'un formulaire via le dict 'champs':
self.fields['email'].label = "New Email Label"
C'est ainsi que vous n'avez pas à vous soucier des champs de formulaire ayant des conflits de noms avec les méthodes de classe de formulaire. (Sinon, vous ne pourriez pas avoir un champ nommé 'clean' ou 'is_valid') Définir les champs directement dans le corps de la classe est surtout juste une commodité.
Cela ne fonctionne pas pour l'héritage du 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")