2009-03-12 13 views
51

私は他の2つのフォームを継承するフォームを持っています。私のフォームでは、親フォームの1つで定義されたフィールドのラベルを変更したいと思います。誰でもこれがどうやってできるのか知っていますか?Django形式のラベル

私は__init__でそれをやろうとしていますが、 "'RegistrationFormTOS'オブジェクトには属性 'email'がありません。私はこれをどのようにすることができるか誰にも分かりますか?

ありがとうございました。ここで

は私のフォームコードです:

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 

答えて

104

あなたは使用する必要があります。

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

注意を最初にあなたはスーパーコールを使用する必要があります。

7

あなたは「フィールド」辞書を経由して、フォーム内のフィールドにアクセス:

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

あなたがフォームフィールドを心配する必要がないようだことフォームクラスメソッドと名前が衝突しています。 (それ以外の場合は、 'clean'または 'is_valid'という名前のフィールドを持つことはできませんでした)クラス本体にフィールドを直接定義するのは、ほとんどの場合便利です。

1

それはモデルの継承のために動作しませんが、あなたはフォームを定義するときは、フィールドの属性としてlabelを設定することができます

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

モデルに直接ラベルを設定することができます。

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

この回答で問題は、それが '1で定義されたフィールドのラベルを変更する方法を説明していないということです親フォームの重要なビットです。 – jamesc

+0

それは私のために働いていませんでした... '__init __()は予期せぬキーワード引数 'label''を持っています – User

+0

管理者のフォームでDidntの仕事! – Raptor

22

ここ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

djangoテンプレートでの使用方法 – user2413621

+2

これはModelFormでのみ機能します。フォームではない – Elwin