2009-03-12 9 views
51

J'ai un formulaire qui hérite de 2 autres formulaires. Dans mon formulaire, je veux changer l'étiquette d'un champ qui a été défini dans l'un des formulaires parent. Est-ce que quelqu'un sait comment cela peut être fait?Django form - set label

J'essaye de le faire dans mon __init__, mais une erreur me dit que l'objet '' RegistrationFormTOS 'n'a pas d'attribut' email '". Est-ce que quelqu'un sait comment je peux faire cela?

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 

Répondre

104

Vous devez utiliser:

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

Notez d'abord, vous devez utiliser l'appel super.

7

champs d'accès Vous sous une forme via le dict « champs »:

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

C'est de sorte que vous n'avez pas à vous soucier des champs de formulaire avoir des conflits de noms avec les méthodes de classe de formulaire. (Sinon, vous ne pouvez pas avoir un champ nommé 'clean' ou 'is_valid') La définition des champs directement dans le corps de la classe est principalement juste une commodité.

1

Il 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") 
4

Vous pouvez définir label comme un attribut de champ lorsque vous définissez la forme.

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',) 
+1

Le problème avec cette réponse est qu'il n'explique pas comment changer 'l'étiquette d'un champ qui a été défini dans un des formes parentales - la forme parente est le bit important. – jamesc

+0

Cela n'a pas fonctionné pour moi ... '__init __() a obtenu un argument de mot-clé inattendu 'label'' – User

+0

N'a pas fonctionné sous forme d'admin! – Raptor

22

Voici un exemple tiré de Overriding the default fields:

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."), 
      }, 
     } 
+0

comment l'utiliser dans le modèle django – user2413621

+2

Cela ne fonctionne que pour ModelForm. Pas de formulaire – Elwin