Django、柔軟な戻るリンクの作成

Python Django

概要

Webサイト内には前のページに戻るリンクがよくありますが、ページの作りによっては少し難しくなることもあります。

私の日記サイトを例に説明しましょう。このサイトでは年や月、カテゴリ、日記検索などが行えます。

日記サイト

「2019年11月」の日記一覧を表示してみました。

検索結果

この状態で、適当な日記を見てみます。

個別の日記

ここで表示された「戻る」リンクを押したとき、今回は「2019年11月」の日記一覧ページに戻る必要があります。「雑談」カテゴリでの一覧から飛んだなら、当然そこに戻るべきですし、キーワード検索した後ならば、その一覧に戻るべきでしょう。

これに限らず、前ページが動的になる場合というのはよくあります。前ページが必ず自サイトならいいんですが、他サイトからのリンクなこともあり得るし、そもそもURL直接アクセスやお気に入りからのアクセスだってあり得ます。こうなってきたときに、ある程度上手く前ページのリンクを作成してくれる機能があると便利です。

テンプレートタグの作成

テンプレートタグを作成します。Djangoアプリケーション内にtemplatetagsディレクトリを作り、中に任意のファイルを作ります。中身は次のようにしておきましょう。

from urllib import parse
from django import template
from django.shortcuts import resolve_url

register = template.Library()


@register.simple_tag
def get_return_link(request):
    top_page = resolve_url('diary:top')  # 最新の日記一覧
    referer = request.environ.get('HTTP_REFERER')  # これが、前ページのURL

    # URL直接入力やお気に入りアクセスのときはリファラがないので、トップぺージに戻す
    if referer:

        # リファラがある場合、前回ページが自分のサイト内であれば、そこに戻す。
        parse_result = parse.urlparse(referer)
        if request.get_host() == parse_result.netloc:
            return referer

    return top_page

これは、次のようなルールで前ページのリンクを取得します。

  • URL直接入力やお気に入りでのアクセスのときは、自サイトのトップ(最新の日記一覧)へ戻る
  • 他サイトから移動してきたときも、自サイトのトップ(最新の日記一覧)へ戻る
  • 自サイトの別ページからの移動ならば、そのページに戻る

処理の内容はコメントのとおりです。デフォルトの戻るページを変えたり、自サイトでも幾つかのページには戻さない、などの処理を加えるのも良いと思います。

使う

あとは、このテンプレートタグを使うだけです。

{% load 作ったファイル名 %}

<a href="{% get_return_link request %}">戻る</a>

Relation Posts

関連記事はありません。

Comment

記事にコメントする

まだコメントはありません。