2009-03-12 14 views
51

Ho un modulo che eredita da 2 altri moduli. Nella mia forma, voglio cambiare l'etichetta di un campo che è stato definito in una delle forme padre. qualcuno sa come questo potrebbe essere fatto?Modulo Django - set etichetta

Sto provando a farlo nel mio __init__, ma genera un errore che dice che l'oggetto "'RegistrationFormTOS' non ha attributo 'email'". Qualcuno sa come posso fare questo?

Grazie.

Ecco il mio codice del modulo:

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 

risposta

104

Si dovrebbe usare:

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

Nota prima si dovrebbe utilizzare la chiamata eccellente.

7

Voi campi di accesso in un modulo tramite il dict 'campi':

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

che è così che non devi preoccuparti di campi di modulo avere un nome in conflitto con i metodi della classe del form. (Altrimenti non si può avere un campo chiamato 'clean' o 'is_valid'). La definizione dei campi direttamente nel corpo della classe è per lo più solo una comodità.

1

E non lavoro per modello di ereditarietà, ma è possibile impostare l'etichetta direttamente nel modello

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

È possibile impostare label come un attributo del campo quando si definisce modulo.

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

Il problema di questa risposta è che non spiega come cambiare 'l'etichetta di un campo che è stato definito in una delle forme padre - la forma genitore è il bit importante. – jamesc

+0

Non ha funzionato per me ... '__init __() ha ottenuto un argomento di parole chiave inaspettato 'label'' – User

+0

Non funziona in forma di amministratore! – Raptor

22

Ecco un esempio tratto dalla 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

come usarlo nel template django – user2413621

+2

Questo funziona solo per ModelForm. Non forma – Elwin