WonderSteve
WonderSteve

Reputation: 927

Django redirect to index view with correct URL after form submission

I am learning Django and am trying to create a form that I can submit a participant's information to the database.

I have an index view, which list all the participants:

http://127.0.0.1:8000/participants/

Clicking a button on the index will go to form submission:

http://127.0.0.1:8000/participants/add_participant/

After submitting the form, the page goes back to the index view, but the URL is not correct, it stucks at http://127.0.0.1:8000/participants/add_participant/

If I refresh the browser immediately, it will add another record to the database.

add_participant.html

<!DOCTYPE html>
<html>
    <head>
        <title>This is the title</title>
    </head>

    <body>
        <h1>Add a Participant</h1>

        <form id="participant_form" method="post" action="/participants/add_participant/">

            {% csrf_token %}
            {{ form.as_p }}

            <input type="submit" name="submit" value="Create Participant" />
        </form>
    </body>

</html>

views.py

from django.shortcuts import render, get_object_or_404, redirect
from django.http import HttpResponse, HttpResponseRedirect

from participants.models import Participant
from .forms import ParticipantForm


# Create your views here.
def index(request):
    participant_list = Participant.objects.order_by('-first_name')[:50]
    context = {'participants': participant_list}
    return render(request, 'participants/index.html', context)

def add_participant(request):
    if request.method == 'POST':
        form = ParticipantForm(request.POST)  
        if form.is_valid():
            form.save(commit=True) 
            return index(request)
    else:
        form = ParticipantForm() 


        return render(request, 'participants/add_participant.html', {'form': form})

urls.py

from django.conf.urls import url

from . import views
from .models import Participant

app_name = 'participants'

urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'add_participant/$', views.add_participant, name='add_participant'),
]

I tried switching the

return index(request)

to:

return HttpResponseRedirect("http://127.0.0.1:8000/participants/")

It solves the problem...but I doubt this is the "right" way to do it. What is the correct way to fix this issue?

Upvotes: 3

Views: 5774

Answers (1)

ahmed
ahmed

Reputation: 5600

You can pass just the path to the redirect response:

return HttpResponseRedirect("/participants/")

This way if you change your domain, the redirect will work.

an other solution is to use reverse

from django.core.urlresolvers import reverse
# ...
return HttpResponseRedirect(reverse(index))

Upvotes: 6

Related Questions