2017-08-10 112 views
1

我在我的绳索尽头弄清楚为什么一个简单的表单重定向不起作用。我通过POST请求提交了一个带有一个文本字段的表单,该表单与相同views.py文件中某个函数的某些数据组合在一起,然后将其保存到数据库的模型中。出于某种原因,通过我在提交表单时设置的重定向方案,我得到了表单的第二个副本。Django - 表单提交没有重定向

feedbackapp/views.py

from django.shortcuts import render, redirect 
from django.http import HttpResponseRedirect 
from django.urls import reverse 

from .forms import FeedbackForm 
from .models import Feedback 


def record_feedback(request): 
    if request.method == 'POST': 
     form = FeedbackForm(request.POST) 
     if form.is_valid(): 
      feedback = Feedback() 
      feedback.submitter_ip = get_client_ip(request) 
      feedback.feedback_text = form.cleaned_data['feedback'] 
      feedback.save() 
      return HttpResponseRedirect(reverse('feedbackapp:thanks')) 

    elif request.method == 'GET': 
     form = FeedbackForm() 
     return render(request, 'feedbackapp/feedback_form.html', {'form': form}) 


def thanks(request): 
    return render(template_name='feedbackapp/thanks.html',request=request) 


# https://stackoverflow.com/questions/4581789/how-do-i-get-user-ip-address-in-django 
def get_client_ip(request): 
    x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR') 
    if x_forwarded_for: 
     ip = x_forwarded_for.split(',')[-1] # needs to be the last element in array for Heroku 
    else: 
     ip = request.META.get('REMOTE_ADDR') 
    return ip 

feedbackapp/forms.py

from django import forms 


class FeedbackForm(forms.Form): 
    feedback = forms.CharField(label='Feedback', max_length=5000) 

feedbackapp/templates/feedbackapp/feedback_form.html

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>Anonymous Feedback</title> 
</head> 
<body> 
    <form action="/" method="post"> 
     {% csrf_token %} 
     {{ form }} 
     <input type="submit" value="Submit"/> 
    </form> 
    <p><i>Note: IP addresses are collected with each submission.</i></p> 
</body> 
</html> 

feedbackapp/templates/feedbackapp/thanks.html

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>Thanks!</title> 
</head> 
<body> 
<p>Thanks for your feedback.</p> 
</body> 
</html> 

feedbackapp/urls.py

from django.conf.urls import url 
from .views import record_feedback, thanks 


urlpatterns = [ 
    url('', record_feedback, name='feedback'), 
    url('thanks/', thanks, name='thanks'), 
] 

anonfeed/urls.py

from django.conf.urls import url, include 
from django.contrib import admin 

urlpatterns = [ 
    url(r'^admin/', admin.site.urls), 
    url('', include('feedbackapp.urls'), namespace='feedbackapp'), 
] 

这几乎是如果thanks观点不符合URL和模板关联。

+2

交换你的'feedbackapp.urls.urlpatterns'的顺序,或者把'$'的'feedback'模式,以表明它仅应如果后面什么也没有,那么去那里,否则无论你去哪个网址,它都会进入你的“反馈”视图。 – Jorden

回答

1

您的空正则表达式覆盖thanks的正则表达式。更改以下行:

url('', record_feedback, name='feedback'), 

url('^$', record_feedback, name='feedback'), 
+0

当它是简单的事情时就得爱。谢谢! – nerdenator