Redirecting

Unicorn has a few different ways to redirect from an action method.

Redirect

To redirect the user, return a HttpResponseRedirect from an action method. Using the Django shortcut redirect method is one way to do that in a typical Django manner.

Note

django.shortcuts.redirect can take a Django model, Django view name, an absolute url, or a relative url. However, the permanent kwarg for redirect has no bearing in this context.

Tip

It is not required to use django.shortcuts.redirect. Anything that returns a HttpResponseRedirect will behave the same in Unicorn.

# redirect.py
from django.shortcuts import redirect
from django_unicorn.components import UnicornView
from .models import Book

class BookView(UnicornView):
    title = ""

    def save_book(self):
        book = Book(title=self.title)
        book.save()
        self.reset()

        return redirect(f"/book/{book.id}")
<!-- redirect.html -->
<div>
  <input unicorn:model="title" type="text" id="title" /><br />
  <button unicorn:click="save_book()">Save book</button>
</div>

HashUpdate

To avoid a server-side page refresh and just update the hash at the end of the url, return HashUpdate from the action method.

# hash_update.py
from django_unicorn.components import HashUpdate, UnicornView
from .models import Book

class BookView(UnicornView):
    title = ""

    def save_book(self):
        book = Book(title=self.title)
        book.save()
        self.reset()

        return HashUpdate(f"#{book.id}")
<!-- hash-update.html -->
<div>
  <input unicorn:model="title" type="text" id="title" /><br />
  <button unicorn:click="save_book()">Save book</button>
</div>

LocationUpdate

To avoid a server-side page refresh and update the whole url, return a LocationUpdate from the action method.

LocationUpdate is instantiated with a HttpResponseRedirect arg and an optional title kwarg.

Note

LocationUpdate uses window.history.pushState so the new url must be relative or the same origin as the original url.

# location_update.py
from django.shortcuts import redirect
from django_unicorn.components import LocationUpdate, UnicornView
from .models import Book

class BookView(UnicornView):
    title = ""

    def save_book(self):
        book = Book(title=self.title)
        book.save()
        self.reset()

        return LocationUpdate(redirect(f"/book/{book.id}"), title=f"{book.title}")
<!-- location-update.html -->
<div>
  <input unicorn:model="title" type="text" id="title" /><br />
  <button unicorn:click="save_book()">Save book</button>
</div>