2009-03-12 34 views
51

Tôi có biểu mẫu kế thừa từ 2 biểu mẫu khác. Trong biểu mẫu của tôi, tôi muốn thay đổi nhãn của một trường được xác định trong một trong các biểu mẫu gốc. Có ai biết làm thế nào để có thể xong không?Biểu mẫu Django - đặt nhãn

Tôi đang cố gắng làm điều đó trong số __init__ của mình, nhưng nó ném một lỗi nói rằng đối tượng "RegistrationFormTOS" không có thuộc tính 'email' ". Có ai biết làm thế nào tôi có thể làm điều này?

Cảm ơn.

Đây là mẫu mã của tôi:

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 

Trả lời

104

Bạn nên sử dụng:

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

Lưu ý đầu tiên bạn nên sử dụng các cuộc gọi siêu.

7

Bạn lĩnh vực truy cập trong một hình thức thông qua 'lĩnh vực' dict:

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

Đó là do đó bạn không cần phải lo lắng về các lĩnh vực hình thức có xung đột tên với các phương thức lớp biểu mẫu. (Nếu không, bạn không thể có một trường có tên 'clean' hoặc 'is_valid') Định nghĩa các trường trực tiếp trong phần thân của lớp chủ yếu chỉ là một sự thuận tiện.

1

Nó không làm việc cho mô hình thừa kế, nhưng bạn có thể đặt nhãn trực tiếp trong mô hình

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

Bạn có thể đặt label như một thuộc tính của trường khi bạn xác định hình thức.

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

Vấn đề với câu trả lời này là nó không giải thích làm thế nào để thay đổi 'nhãn của một trường đã được xác định trong một của các biểu mẫu gốc - biểu mẫu gốc là bit quan trọng. – jamesc

+0

Nó không hoạt động đối với tôi ... '__init __() nhận được một đối số từ khóa không mong muốn 'label'' – User

+0

Didnt' làm việc dưới dạng quản trị viên! – Raptor

22

Dưới đây là một ví dụ lấy từ 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

làm thế nào để sử dụng nó trong django mẫu – user2413621

+2

Điều này chỉ hoạt động cho ModelForm. Không phải mẫu – Elwin

Các vấn đề liên quan