nerdenator
nerdenator

Reputation: 1297

Django - No redirect on form submission

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

Answers (1)

Selcuk
Selcuk

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

Related Questions