LoginSignup
1
4

Djangoテンプレートでincludeを使う時にurlパスを調べてページごとに表示内容を変える方法

Posted at

動機

Djangoのテンプレートにおいて、base.html内で部品としてナビバーをincludeを使って読み込もうとした。
そのときナビバーで表示するリストの要素を、ページごとに変更したかった。

完成形

  • トップページの画面
    Screenshot_2023-05-28-18-20-30-06_40deb401b9ffe8e1df2f1cc5ba480b12~2.jpg

  • トップページのナビバー部品
    Screenshot_2023-05-28-18-20-54-03_40deb401b9ffe8e1df2f1cc5ba480b12~2.jpg

  • 試しに「POSTS」をクリックするとトップページ内のPOSTSのセクションまで自動でスクロールする
    Screenshot_2023-05-28-18-21-05-20_40deb401b9ffe8e1df2f1cc5ba480b12~2.jpg

  • 投稿記事の詳細画面
    Screenshot_2023-05-28-18-23-13-72_40deb401b9ffe8e1df2f1cc5ba480b12~2.jpg

  • トップページ以外のページでは自動スクロールの機能は不要なので、ナビバーのリスト要素から要らないものを消したい(LOGIN, SIGNUPはそのまま残したい)
    Screenshot_2023-05-28-18-23-25-08_40deb401b9ffe8e1df2f1cc5ba480b12~2.jpg

base.htmlでナビバー部品を読み込む場合の問題点

  • base.htmlでincludeしてナビバー部品を読み込む場合、共通部品が各ページで読み込まれてしまうため、ページごとに異なるリスト要素の表示を実現できない
  • そこで、base.htmlではナビバー部品を読み込まず、各ページのhtmlファイルにて必要なナビバー部品をそれぞれ用意してincludeすることを考えた。

base.htmlでナビバー部品を読み込まない場合の問題点

  • base.htmlでナビバー部品を読み込まない場合、各htmlファイルでナビバー部品をわざわざincludeする必要がある。
  • ナビバー部品のhtmlファイルが増えて管理が大変。
  • 修正の手間が増えてとても面倒くさい。

解決策

  • やはりbase.htmlでナビバー部品を読み込むことにし、リクエストページのurlパスを調べ、if文を使って各urlパスごとに表示する内容を変えることにした。

      #django-recursive-post/templates/includes/header/header-nav.html
    
      <ul class="nav-menu">
        {% url 'top' as top_url %}
        {% if request.path == top_url %}
          <li><a href="#pickup">PICK UP</a></li>
          <li><a href="#posts">POSTS</a></li>
          <li><a href="#contact">CONTACT</a></li>
        {% endif %}
        {% if user.is_authenticated %}
          <li><a href="{% url "account_logout" %}">LOGOUT</a></li>
        {% else %}
          <li><a href="{% url "account_login" %}">LOGIN</a></li>
          <li><a href="{% url "account_signup" %}">SIGN UP</a></li>
        {% endif %}
    
以下の2行がポイント

{% url 'top' as top_url %}
{% if request.path == top_url %}

{% url urlpatternsのname as 変数名 %} とすることでurlパスを変数に格納することが出来る。
その値とrequest.pathの値を比べることで目的の動作を実現できた。

今回は以上となります。少しでも参考になれば幸いです。

1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4