2010-04-28 52 views
3

我在一個Django的形式Django的定製表單標籤

這個自定義標籤有一個問題,就是在文件contact_form.py形式代碼:

from django import forms 

class ContactForm(forms.Form): 
    def __init__(self, subject_label="Subject", message_label="Message", email_label="Your email", cc_myself_label="Cc myself", *args, **kwargs): 
     super(ContactForm, self).__init__(*args, **kwargs) 

     self.fields['subject'].label = subject_label 
     self.fields['message'].label = message_label 
     self.fields['email'].label = email_label 
     self.fields['cc_myself'].label = cc_myself_label 

    subject = forms.CharField(widget=forms.TextInput(attrs={'size':'60'})) 
    message = forms.CharField(widget=forms.Textarea(attrs={'rows':15, 'cols':80})) 
    email = forms.EmailField(widget=forms.TextInput(attrs={'size':'60'})) 
    cc_myself = forms.BooleanField(required=False) 

的觀點我在看起來像使用此:

def contact(request, product_id=None): 
    . 
    . 
    . 
    if request.method == 'POST': 
     form = contact_form.ContactForm(request.POST) 
     if form.is_valid(): 
      . 
      . 
     else: 
      form = contact_form.ContactForm(
       subject_label = "Subject", 
       message_label = "Your Message", 
       email_label = "Your email", 
       cc_myself_label = "Cc myself") 

用於初始化標籤最終將依賴於語言,即英語,荷蘭語,法語等字符串的字符串

當我測試不發送電子郵件,而不是重定向頁面的形式返回形式:

<QueryDict: {u'cc_myself': [u'on'], u'message': [u'message body'], 
u'email':[u'[email protected]'], u'subject': [u'test message']}>: 

其中標的標籤是以前。這顯然是代表表單字段及其內容的字典。

當我更改文件contact_form.py到:

from django import forms 

class ContactForm(forms.Form): 
    """ 
    def __init__(self, subject_label="Subject", message_label="Message", email_label="Your email", cc_myself_label="Cc myself", *args, **kwargs): 
     super(ContactForm, self).__init__(*args, **kwargs) 

     self.fields['subject'].label = subject_label 
     self.fields['message'].label = message_label 
     self.fields['email'].label = email_label 
     self.fields['cc_myself'].label = cc_myself_label 
    """ 
    subject = forms.CharField(widget=forms.TextInput(attrs={'size':'60'})) 
    message = forms.CharField(widget=forms.Textarea(attrs={'rows':15, 'cols':80})) 
    email = forms.EmailField(widget=forms.TextInput(attrs={'size':'60'})) 
    cc_myself = forms.BooleanField(required=False) 

即禁用初始化,然後一切正常。表單數據通過電子郵件發送,重定向頁面顯示。所以很顯然,init代碼是不正確的。但是什麼?

我真的很感謝一些幫助。

回答

2

您應該更改表格init decleration,QueryDict獲取打印的是您在初始化表單時作爲第一個參數傳遞的request.GET或request.POST。

我想改變這個

def __init__(self, subject_label="Subject", ... 

這個

def __init__(self, data=None, subject_label="Subject", ... ...): 
    super(ContactForm, self).__init__(data, *args, **kwargs) 
    ... 

將解決你的問題。

+0

什麼將__init__期望的數據參數?因爲當我添加這個數據參數時__init__抱怨想要2個非關鍵字參數,但只獲得1.因此,在創建表單對象時應該爲數據提供什麼參數? – Henri 2010-04-30 11:55:27

+0

你也應該通過它超級初始化。 this:super(ContactForm,self).__ init __(* args,** kwargs) 應改爲:super(ContactForm,self).__ init __(data,* args,** kwargs)。我更新了我的答案。 – vinilios 2010-04-30 16:01:44

+0

那麼如何創建表單呢?因爲現在創建一個ContactForm對象還需要一個參數傳遞給數據。 form = ContactForm(data = ...數據的參數是什麼?我認爲它可能是request.POST,但是最初的表單會報告缺少的所有必填字段。 – Henri 2010-04-30 22:45:42

2

我認爲你是以錯誤的方式接近問題。您應該使用internationalisatoin模塊。

這樣,你可以有你的形式是這樣的:

class ContactForm(forms.Form): 
    subject = forms.CharField(label=_('contact_form_subject'), widget=forms.TextInput(attrs={'size':'60'})) 

如果您提供的翻譯文件Django的國際化系統會自動插入正確的翻譯爲您服務。

+0

我知道國際化是一種選擇,但這並不能回答我的問題。如何修改表單中的標籤。一個選項是使用變量調整模板並跳過修改ContactForm類。 – Henri 2010-04-28 10:19:10

+0

國際化選項是改變標籤的解決方案,所以我仍然建議使用它。然而,這不是問題,雖然這也可以解決它;)我不知道爲什麼它現在不能正常工作,但是我必須要問...... super()的縮進部分在這個例子中只有錯誤?因爲它應該與'self.fields [...]在同一級別。label ='...'' – Wolph 2010-04-28 13:01:03

+0

縮進在這裏只是錯誤的。在代碼中它與self.fields [...]。label ...等級相同。對困惑感到抱歉。我編輯了這個例子。 我不使用國際化的原因是國際字符串駐留的是數據庫,所以網站管理員/管理員可以輕鬆地爲應用程序添加對新語言的支持。語言支持用於網絡文本,也用於產品說明和以各種語言發佈的文章。 – Henri 2010-04-28 13:56:05