Django shortcuts

Django shortcuts

Published 18. jul 2018 06:44 by Stein Ove Helset

Django has some shortcuts to help you speed up your development process even more. In this post we'll cover a few of them.

How to use the shortcuts

All of Django's lives inside the django.shortcuts module and you can import them like this:


from django.shortcuts import render, redirect, get_object_or_404, get_list_or_404

render

Params: render(request, template_name, context=None, content_type=None, status=None, using=None)

An example of the render function


from django.shortcuts import render

def home(request):
    context = {'title': 'Home'}
    return render(request, 'home.html', context)

If it wasn't for this shortcut it would look like this


from django.http import HttpResponse
from django.template import loader

def home(request):
    template = loader.get_template('home.html')
    context = {'title': 'Home'}
    return HttpResponse(template.render(context, request))

As you can see render requires a less code and is more readable. Using the render function makes the code look more neat and is easier to maintain.

redirect

Params: redirect(to, permanent=False, *args, **kwargs)

An example of the redirect function


from django.shortcuts import redirect

def home_view_redirect(request):
    """ Redirect to a view (view-name) """
    return redirect('view-name', slug='this-is-an-example')
    
def home_hardcode_redirect(request):
    """ Redirect to a hardcoded url ('/about/') """
    return redirect('/about/')

This code will do the same as this (the view redirect is not possible)


from django.http import HttpReturnRedirect

def home_hardcode_redirect(request):
    """ Redirect to a hardcoded url ('/about/') """
    return HttpReturnRedirect('/about/')

The amount of code and readability is about the same, but the redirect shortcut makes it possible to redirect directly to another view. It also looks slightly better.

get_object_or_404

Params: get_object_or_404(klass, *args, **kwargs)

An example of how to use this shortcut


from django.shortcuts import get_object_or_404

from .models import Post

def detail(request, slug):
    post = get_object_or_404(Post, slug=slug)

This code will do the same this as this


from django.http import Http404

from .models import Post

def detail(request, slug):
    try:
        post = Post.objects.get(slug=slug)
    except Post.DoesNotExist:
        raise Http404("No post matches the given slug")

The get_object_or_404 saves you a little bit of code and it looks much better. Here is another example if you want to use a queryset instead of the model


from django.shortcuts import get_object_or_404

from .models import Post

def detail(request, slug):
    queryset = Post.objects.filter(published=True)
    post = get_object_or_404(queryset, slug=slug)

# Slightly better

def detail(request, slug):
    post = get_object_or_404(Post, published=True, slug=slug)

get_list_or_404

Params: get_list_or_404(klass, *args, **kwargs)

An example of how to use the get_list_or_404 shortcut


from django.shortcuts import get_list_or_404

from .models import Post

def home(request):
    posts = get_list_or_404(Post, published=True)

Here is the same code, but without the shortcut


from django.http import Http404

from .models import Post

def home(request):
    posts = list(Post.objects.filter(published=True))
    if not posts:
        raise Http404("No posts matches the given query.")

Summary

The shortcuts can be quite helpful at times and makes your code more maintainable. But I have added the examples of how the code would look without the shortcuts because it's important to know how they work and how to work without them when you need to.

Share this post

Comments

Nic

08. nov 2018 12:15

You write many good posts, but I hope you would do something about the design. Posts like this look kind of messy!

Add comment