2013-10-16 47 views
2

我创建了一个模型表单,然后在每个页面上都包含表单的情况下将其呈现在context processor中。表单提交后,应重新指向“谢谢”页面。但它似乎只是重新加载页面并删除表单。通过URL在页面上呈现时,我已经全部工作了。由于将函数移到我的上下文处理器,它不会正确重定向。Django模型表单没有正确提交

它还保存在管理中提供给模型的信息。所以我猜测这是重定向的问题。

这里是我的背景处理器:

from django.conf import settings 
from contact_enquiries import forms 

from django.shortcuts import render 
from django.http import HttpResponseRedirect 


def contact(request): 
    if request.method == 'POST': 
     form = forms.ContactUsForm(request.POST) 

     if form.is_valid(): 

      form.save() 

     return HttpResponseRedirect('/thanks/') 

    else: 
     form = forms.ContactUsForm() 

     return { 
        'contact_form' : form, 
     } 

forms.py

class ContactUsForm(ModelForm): 
    class Meta: 
     model = ContactUs 
     fields = ['name', 'contact_number', 'email', 'enquiry'] 

models.py

class ContactUs(models.Model): 
    name = models.CharField(max_length=200) 
    contact_number = models.IntegerField(max_length=50) 
    email = models.EmailField(max_length=300) 
    enquiry = models.TextField() 

    class Meta: 
     verbose_name_plural = "Contact Us" 


    def __unicode__(self): 
     return self.name 

回答

1

上下文处理器应该总是返回一本字典,它不应该返回一个http响应。

一种选择是让您的联系表单发布到不同的视图。您可以通过更改模板中表单的action属性来完成此操作。

<form action="{% url 'contact' %}" method="post"> 

你的联系人视图和URL模式会是这个样子:

url('^/contact/$', contact, name="contact"), 

def contact(request): 
    if request.method == 'POST': 
     form = forms.ContactUsForm(request.POST) 

     if form.is_valid(): 
      form.save() 
      return HttpResponseRedirect('/thanks/') 

    else: 
     form = forms.ContactUsForm() 

    return render(request, "contact.html", { 
       'contact_form' : form, 
    }) 

你的背景处理器则简化为:

def contact(request): 
    form = forms.ContactUsForm() 
    return {'contact_form' : form} 
+0

没有现在听起来真的很愚蠢,我将如何改变它所以它发布到不同的观点? – JDavies

+0

这不是一个愚蠢的问题,我扩大了我的答案。 – Alasdair

+0

谢谢。我会尽快尝试。 :) – JDavies