Reputation: 1297
I'm at the end of my rope trying to figure out why a simple form redirect is not working. I'm submitting a form with one text field via POST request that gets combined with some data from a function in the same views.py file, which is then saved to the model on the database. For some reason, with the redirect schemes that I've set up on submission of the form, I get either a second copy of the form.
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'),
]
It is almost as if the thanks
view is not associating with the url and the template.
Upvotes: 1
Views: 1763
Reputation: 59164
Your empty regex overrides the one for thanks
. Change the following line:
url('', record_feedback, name='feedback'),
to
url('^$', record_feedback, name='feedback'),
Upvotes: 1