2009-03-12 17 views
51

Tengo un formulario que hereda de otros 2 formularios. En mi forma, quiero cambiar la etiqueta de un campo que se definió en una de las formas principales. ¿Alguien sabe cómo se puede hacer esto?Formulario de Django - etiqueta de conjunto

Estoy tratando de hacerlo en mi __init__, pero arroja un error que dice que el objeto '' RegistrationFormTOS 'no tiene ningún atributo' email '". ¿Alguien sabe cómo puedo hacer esto?

Gracias.

Aquí está mi código del formulario:

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 

Respuesta

104

Deberá utilizar:

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

Nota primero que debe utilizar la llamada súper.

7

campos de acceso que en una forma a través de la dict 'campos':

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

Eso es por lo que no tiene que preocuparse de campos de formulario tener conflictos de nombres con los métodos de clase de formulario. (De lo contrario, no podría tener un campo llamado 'clean' o 'is_valid') Definir los campos directamente en el cuerpo de la clase es principalmente una conveniencia.

1

No funciona para el modelo de herencia, pero se puede establecer la etiqueta directamente en el modelo

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

Puede establecer label como un atributo de campo cuando se define la forma.

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

El problema con esta respuesta es que no explica cómo cambiar 'la etiqueta de un campo que se ha definido en una de las formas padre' - la forma principal es el bit importante. – jamesc

+0

No funcionó para mí ... '__init __() obtuvo una inesperada palabra clave 'etiqueta' argumento – User

+0

¡No funcionó en forma de administrador! – Raptor

22

He aquí un ejemplo tomado 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

cómo usarlo en la plantilla django – user2413621

+2

Esto solo funciona para ModelForm. No forma – Elwin

Cuestiones relacionadas