Django redirect shortcuts and files

I ran across a very helpful Django shortcut utility today called redirect while upgrading a section of code in my webapp for work.

I had used redirects in my Django webapps before, but I had never read the documentation closely enough to recognize that there is one really great feature baked into this method. First, let me give some background on my use case.

I have a form where users can upload a file and assign it a type. That file is first saved to the database, then processed and the contents are displayed on the next form (the webapp is a file import tool with custom field mapping). The issue I was running into was trying to go from a successful file upload to a mapping form for that newly uploaded file. There didn’t seem like an easy way to simply “go” to the next form.

In reading the first example on djangoproject.com, I had a bit of an epiphany. The documentation reads:

By passing some object [to the redirect method]; that object’s get_absolute_url() method will be called to figure out the redirect URL

What this meant for me was that I could simply pass the newly saved file object to the redirect method, and rely on the get_absolute_url permalink I had already created to provide the url for my next form.

Here is a brief snippet of code from my project showing how I did this:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# models.py
from django.db import models
from django_extensions.db import fields

class CSVFile(models.Model):
    uuid = fields.UUIDField(max_length=36, unique=True)
    file = models.FileField(max_length=100, upload_to='beta')
    recordtype = models.CharField(max_length=100)
    created = models.DateTimeField(auto_now_add=True)

    @models.permalink
    def get_absolute_url(self):
        return ('wizard.views.wizard_beta_mapping', [str(self.uuid)])


# views.py
from django.shortcuts import redirect
from wizard.forms import WizardFormBetaUpload
from wizard.models import CSVFile

def wizard_beta_upload(request):
    if request.POST and request.method == 'POST':
        form = WizardFormBetaUpload(request.POST, request.FILES)

        if form.is_valid():
            c_recordtype = form.cleaned_data['recordtype']
            csvfile = CSVFile(
                file=request.FILES['csvfile'],
                recordtype=c_recordtype
            )
            csvfile.save()
            return redirect(csvfile)
to top

Tags

Archives