2015-11-10 35 views
2

我在製作聯繫表格。當我讓Django在我的模板中使用{{ form.as_p }}解壓表單的字段時,它呈現得很好,但是如果我不想手動呈現字段,那麼我遇到了問題。如何爲表單中的未填充字段添加錯誤消息?

我想要的是添加一個錯誤消息,如果一個字段未實現。

這是我使用Django文檔https://docs.djangoproject.com/en/1.8/topics/forms/

<form role="form" method="post"> 
    {% csrf_token %} 
{{ form.non_field_errors }} 
<div class="fieldWrapper"> 
    {{ form.contact_name.errors }} 
    <label for="{{ form.contact_name.id_for_label }}">Name:</label> 
    {{ form.contact_name }} 
</div> 
<div class="fieldWrapper"> 
    {{ form.content.errors }} 
    <label for="{{ form.content.id_for_label }}">Message:</label> 
    {{ form.content }} 
</div> 
<div class="fieldWrapper"> 
    {{ form.contact_email.errors }} 
    <label for="{{ form.contact_email.id_for_label }}">Email:</label> 
    {{ form.contact_email }} 
</div> 
    <input type="submit" value="Submit" /> 
</form> 

做,但如果某些字段沒有兌現我沒有得到錯誤信息。 ,我會在我的view.py定義一個空的形式下else form = form_class()

這是我現在使用的代碼:

views.py

def contact(request): 
    form_class = ContactForm 
    if request.method == 'POST': 
     form = form_class(data=request.POST) 
     if form.is_valid(): 
      contact_name = request.POST.get('contact_name', '') 
      contact_email = request.POST.get('contact_email', '') 
      form_content = request.POST.get('content', '') 

      template = get_template('agency/contact_template.txt') 
      context = Context({ 
       'contact_name': contact_name, 
       'contact_email': contact_email, 
       'form_content': form_content, 
      }) 

      content = template.render(context) 

      email = EmailMessage(
       "New messages", 
       content, 
       "My web site " + '<[email protected]>', 
       ['[email protected]'], 
       headers = {'Message respond to': contact_email} 
      )  
      email.send() 

      return render_to_response('papers/thank_you.html', {}, context_instance=RequestContext(request)) 

     else: 
      form = form_class() 

    return render_to_response('papers/contact.html', {'form': form_class}, context_instance=RequestContext(request)) 

contact.html

 <form role="form" id="contact-form" action="" method="post"> 
      {% csrf_token %} 
      {{ form.as_p }} 
      <p class="contact-submit"> 
       <button id="contact-submit" class="submit" type="submit" value="Submit">Send</button> 
      </p> 
     </form> 

forms.py

from django import forms 

class ContactForm(forms.Form): 
    contact_name = forms.CharField(required=True) 
    contact_email = forms.EmailField(required=True,) 
    content = forms.CharField(
     required=True, 
     widget=forms.Textarea) 


    def __init__(self, *args, **kwargs): 
     super(ContactForm, self).__init__(*args, **kwargs) 
     self.fields['contact_name'].label = "Name:" 
     self.fields['contact_email'].label = "Email:" 
     self.fields['content'].label = "Message" 
+1

你可以在你的表單中寫一個乾淨的方法,看看這個https://docs.djangoproject.com/en/1.8/ref/forms/validation/#cleaning-a-specific-field-attribute –

+0

As另外,你可以通過使用'render'而不是'render_to_response'來簡化你的代碼,例如'return render(request,'papers/contact.html',{'form':form_class})''。 – Alasdair

回答

1

您的縮進不正確。 else塊應該符合if request.method == POST

if request.method == 'POST': 
    form = form_class(data=request.POST) 
    if form.is_valid(): 
     # process form and return response 
else: 
    form = form_class() 

通過這種方式,用於與發佈數據的結合形式時的形式是無效的,並且任何錯誤將被顯示給用戶。由於您有required=True,如果必填字段留空,Django會自動添加錯誤。

其次,當您呈現模板時,您需要傳遞表單,而不是表單類。

return render_to_response('papers/contact.html', {'form': form}, context_instance=RequestContext(request)) 

最後,它是發送電子郵件,而不是渲染「謝謝」模板後重定向到一個「謝謝」頁面是一個好主意。這會在用戶刷新謝謝頁面時停止發送多個電子郵件。

+0

非常感謝,現在一切都合情合理。 –

相關問題