user1919
user1919

Reputation: 3938

Most appropriate way to redirect page after successful POST request in Django

I have build a view and a form in Django1.5. If the POST request is successful (based on some values I set) then I need the page to redirect to another URL which is created simultaneously.

Otherwise, if the POST was not successful I need to stay on the same page. Right now I have solved the problem as following but I am quite sure this is not the best way to do it:

This is a part of my view:

def layer_create(request, template='layers/layer_create.html'):
    if request.method == 'GET':
       ....
    elif request.method == 'POST':
       out = {}
       ...
       new_table = 'something that comes from the form'
       if form.is_valid():
         ...
         try:
           ...
           out['success'] = True
         except:
           ...
           out['success'] = False
         finally:
           if out['success']:
            status_code = 200
             # THIS IS THE PART WHICH I THINK I CAN IMPROVE
            template = '/something/workspace:' + new_table + '/metadata' 

       else: # if form not valid
         out['success'] = False
        return render_to_response(template, RequestContext(request, {'form': form}))

This part of the code:

    template = '/something/workspace:' + new_table + '/metadata' 

seems very ugly to me. But as I am quite new in Django I am not sure how to approach this matter.

Upvotes: 0

Views: 4167

Answers (2)

user1919
user1919

Reputation: 3938

After all, I have used the "reverse" method as follows:

layer = 'geonode:' + new_table
return HttpResponseRedirect(
   reverse(
       'layer_metadata',
        args=(
             layer,
         )))

Where my urls.py file includes:

url(r'^(?P<layername>[^/]*)/metadata$', 'layer_metadata', name="layer_metadata"),

As described here this is the most appropriate way to do it.

Upvotes: 0

ohrstrom
ohrstrom

Reputation: 2970

A side note first about Django 1.5 - you're highly advised to upgrade to a supported version like 1.8.

Redirecting

For redirecting you can use the redirect shortcut. (Or HttpResponseRedirect)

from django.shortcuts import redirect
# out of a view context
return redirect('/url/to/redirect/to/')

Building URLs

Indeed - as you did mention, your attempt with template = '/something/workspace:' + new_table + '/metadata' is not the cleanest way :)

Django provides a really nice way with the URL dispatcher.

A complete solution here would go too far (or definitely would require more detailed information about your project structure) - I would recommend you to dive into the Django URL dispatcher.

In short you would do something like:

# app/urls.py
urlpatterns = [
    #...
    url(r'^workspace/(?P<id>[0-9]+)/metadata/$', views.workspace_detail, name='workspace-detail-metadata'),
    #...
]

Then you are able to reverse your URL patterns:

from django.core.urlresolvers import reverse
url = reverse('workspace-detail-metadata', kwargs={'id': 123})
# would result in:
# .../workspace/123/metadata/

Upvotes: 1

Related Questions