Djangoで最初の小さなWebアプリを作成したばかりで、気に入っています。古いプロダクションPHPサイトをDjangoに変換することから始めようとしています。そのテンプレートの一部として、ナビゲーションバーがあります。
PHPでは、各navオプションのURLをテンプレートコードで現在のURLに対してチェックし、CSSクラスが並んでいる場合は適用します。それは恐ろしく乱雑です。
Djangoに良いものや、テンプレート内のコードを処理する良い方法はありますか?
まず、現在のURLを取得するにはどうすればよいですか?
テンプレートの継承を使用して、ナビゲーションをカスタマイズします。例えば:
base.html
<html>
<head>...</head>
<body>
...
{% block nav %}
<ul id="nav">
<li>{% block nav-home %}<a href="{% url home %}">Home</a>{% endblock %}</li>
<li>{% block nav-about %}<a href="{% url about %}">About</a>{% endblock %}</li>
<li>{% block nav-contact %}<a href="{% url contact %}">Contact</a>{% endblock %}</li>
</ul>
{% endblock %}
...
</body>
</html>
about.html
{% extends "base.html" %}
{% block nav-about %}<strong class="nav-active">About</strong>{% endblock %}
Ifを行う必要はありません。次のコードをご覧ください。
tags.py
@register.simple_tag
def active(request, pattern):
import re
if re.search(pattern, request.path):
return 'active'
return ''
urls.py
urlpatterns += patterns('',
(r'/$', view_home_method, 'home_url_name'),
(r'/services/$', view_services_method, 'services_url_name'),
(r'/contact/$', view_contact_method, 'contact_url_name'),
)
base.html
{% load tags %}
{% url 'home_url_name' as home %}
{% url 'services_url_name' as services %}
{% url 'contact_url_name' as contact %}
<div id="navigation">
<a class="{% active request home %}" href="{{ home }}">Home</a>
<a class="{% active request services %}" href="{{ services }}">Services</a>
<a class="{% active request contact %}" href="{{ contact }}">Contact</a>
</div>
それでおしまい。実装の詳細については、次をご覧ください。
gnuvince.wordpress.com
110j.wordpress.com
上記の110jのクリーンさが気に入ったので、ほとんどを取り、リファクタリングして3つの問題を解決しました。
ここにあります:
tags.py:
from Django import template
register = template.Library()
@register.tag
def active(parser, token):
args = token.split_contents()
template_tag = args[0]
if len(args) < 2:
raise template.TemplateSyntaxError, "%r tag requires at least one argument" % template_tag
return NavSelectedNode(args[1:])
class NavSelectedNode(template.Node):
def __init__(self, patterns):
self.patterns = patterns
def render(self, context):
path = context['request'].path
for p in self.patterns:
pValue = template.Variable(p).resolve(context)
if path == pValue:
return "active" # change this if needed for other bootstrap version (compatible with 3.2)
return ""
urls.py:
urlpatterns += patterns('',
url(r'/$', view_home_method, {}, name='home_url_name'),
url(r'/services/$', view_services_method, {}, name='services_url_name'),
url(r'/contact/$', view_contact_method, {}, name='contact_url_name'),
url(r'/contact/$', view_contact2_method, {}, name='contact2_url_name'),
)
base.html:
{% load tags %}
{% url home_url_name as home %}
{% url services_url_name as services %}
{% url contact_url_name as contact %}
{% url contact2_url_name as contact2 %}
<div id="navigation">
<a class="{% active request home %}" href="home">Home</a>
<a class="{% active request services %}" href="services">Services</a>
<a class="{% active request contact contact2 %}" href="contact">Contact</a>
</div>
私は Django-lineageの著者であり、この質問を解決するために特別に書いたものです:D
私は自分のプロジェクトで(完全に受け入れられる)jpwattsメソッドを使用することにイライラし、110jの答えからインスピレーションを得ました。系統は次のようになります。
{% load lineage %}
<div id="navigation">
<a class="{% ancestor '/home/' %}" href="/home/">Home</a>
<a class="{% ancestor '/services/' %}" href="/services/">Services</a>
<a class="{% ancestor '/contact/' %}" href="/contact/">Contact</a>
</div>
引数が現在のページURLの先頭と一致する場合、ancestor
は単に「アクティブ」に置き換えられます。
可変引数、および完全な{% url %}
タイプの逆引きもサポートされています。いくつかの設定オプションを振りかけ、少し肉付けして、すべての人が使用できるようにパッケージ化しました。
誰かが興味を持っているなら、それについてもう少し読んでください:
Django 1.5 から:
すべての汎用クラスベースビュー(またはContextMixinから継承するクラスベースビュー)では、コンテキストディクショナリには、Viewインスタンスを指すビュー変数が含まれています。
そのため、このようなビューを使用している場合は、likie breadcrumbs
をクラスレベルのフィールドとして追加し、テンプレートで使用できます。
ビューコードの例:
class YourDetailView(DetailView):
breadcrumbs = ['detail']
(...)
テンプレートでは、次のように使用できます。
<a href="/detail/" {% if 'detail' in view.breadcrumbs %}class="active"{% endif %}>Detail</a>
親ナビゲーションアイテムをさらに「強調表示」する場合は、breadcrumbs
リストを拡張する必要があります。
class YourDetailView(DetailView):
breadcrumbs = ['dashboard', 'list', 'detail']
(...)
...およびテンプレート内:
<a href="/dashboard/" {% if 'dashboard' in view.breadcrumbs %}class="active"{% endif %}>Dashboard</a>
<a href="/list/" {% if 'list' in view.breadcrumbs %}class="active"{% endif %}>List</a>
<a href="/detail/" {% if 'detail' in view.breadcrumbs %}class="active"{% endif %}>Detail</a>
これは簡単でクリーンなソリューションであり、ネストされたナビゲーションで非常にうまく機能します。
特定のナビゲーションアイテムではなく、ページのbody要素にクラスまたはIDを適用できます。
HTML:
<body class="{{ nav_class }}">
CSS:
body.home #nav_home,
body.about #nav_about { */ Current nav styles */ }
私はこのようにします:
<a class="tab {% ifequal active_tab "statistics" %}active{% endifequal %}" href="{% url Member.Statistics %}">Statistics</a>
あとは、ビューに{'active_tab': 'statistics'}
私のコンテキスト辞書に。
RequestContext
を使用している場合、テンプレートの現在のパスを次のように取得できます。
{{ request.path }}
そしてあなたの見解では:
from Django.template import RequestContext
def my_view(request):
# do something awesome here
return template.render(RequestContext(request, context_dict))
上記のnivhabからコードを取得し、不自然さを取り除き、きれいなテンプレートタグにし、/ account/edit /が/ account /タブをアクティブにするように修正しました。
#current_nav.py
from Django import template
register = template.Library()
@register.tag
def current_nav(parser, token):
import re
args = token.split_contents()
template_tag = args[0]
if len(args) < 2:
raise template.TemplateSyntaxError, "%r tag requires at least one argument" % template_tag
return NavSelectedNode(args[1])
class NavSelectedNode(template.Node):
def __init__(self, url):
self.url = url
def render(self, context):
path = context['request'].path
pValue = template.Variable(self.url).resolve(context)
if (pValue == '/' or pValue == '') and not (path == '/' or path == ''):
return ""
if path.startswith(pValue):
return ' class="current"'
return ""
#template.html
{% block nav %}
{% load current_nav %}
{% url home as home_url %}
{% url signup as signup_url %}
{% url auth_login as auth_login_url %}
<ul class="container">
<li><a href="{{ home_url }}"{% current_nav home_url %} title="Home">Home</a></li>
<li><a href="{{ auth_login_url }}"{% current_nav auth_login_url %} title="Login">Login</a></li>
<li><a href="{{ signup_url }}"{% current_nav signup_url %} title="Signup">Signup</a></li>
</ul>
{% endblock %}
これは、上記の鳥羽が提案したcssソリューションの単なる変形です。
基本テンプレートに以下を含めます。
<body id="section-{% block section %}home{% endblock %}">
次に、基本使用を拡張するテンプレートで:
{% block section %}show{% endblock %}
次に、cssを使用して、bodyタグに基づいて現在の領域を強調表示できます(たとえば、nav-homeのIDを持つリンクがある場合)。
#section-home a#nav-home{
font-weight:bold;
}
これまでの回答ありがとうございます、紳士。また少し違うものを探しました。
私のテンプレートでは:
<li{{ link1_active }}>...link...</li>
<li{{ link2_active }}>...link...</li>
<li{{ link3_active }}>...link...</li>
<li{{ link4_active }}>...link...</li>
ロジック(通常はurls.py)でどのページを表示するかを決定したら、class="selected"
は、テンプレートの正しい名前の下のコンテキストの一部として。
たとえば、link1ページにいる場合は、{'link1_active':' class="selected"'}
をすくい上げて注入するテンプレートのコンテキストに。
動作しているように見え、fairly cleanです。
編集:HTMLをコントローラー/ビューに入れないように、これを少し変更しました:
<li{% if link1_active %} class="selected"{% endif %}>...link...</li>
<li{% if link2_active %} class="selected"{% endif %}>...link...</li>
...
これにより、テンプレートが少し読みにくくなりますが、同意しますが、urlsファイルから生のHTMLをプッシュしない方が良いでしょう。
適切なパラメーターで reverse function を使用して、現在のURLを取得できます。
同じページに複数のメニューがあり、ループを介して動的に作成されます。コンテキストに関する上記の投稿は、私に簡単な修正を与えました。これが誰かを助けることを願っています。 (アクティブなテンプレートタグに加えてこれを使用します-私の修正は動的な問題を解決します)。馬鹿げた比較のように思えますが、うまくいきます。変数にactive_something-uniqueおよびsomething-uniqueという名前を付けることを選択しました。これにより、ネストされたメニューで機能します。
ここにビューの一部があります(私がやっていることを理解するのに十分です):
def project_list(request, catslug):
"render the category detail page"
category = get_object_or_404(Category, slug=catslug, site__id__exact=settings.SITE_ID)
context = {
'active_category':
category,
'category':
category,
'category_list':
Category.objects.filter(site__id__exact=settings.SITE_ID),
}
そして、これはテンプレートからです:
<ul>
{% for category in category_list %}
<li class="tab{% ifequal active_category category %}-active{% endifequal %}">
<a href="{{ category.get_absolute_url }}">{{ category.cat }}</a>
</li>
{% endfor %}
</ul>
@ tback の答えに対する%if%
タグ:
# navigation.py
from Django import template
from Django.core.urlresolvers import resolve
register = template.Library()
@register.filter(name="activate_if_active", is_safe=True)
def activate_if_active(request, urlname):
if resolve(request.get_full_path()).url_name == urlname:
return "active"
return ''
テンプレートで次のように使用します。
{% load navigation %}
<li class="{{ request|activate_if_active:'url_name' }}">
<a href="{% url 'url_name' %}">My View</a>
</li>
そして、"Django.core.context_processors.request"
あなたのTEMPLATE_CONTEXT_PROCESSORS
設定。
包含タグを使用するのが最善であることがわかりました。
templates/fnf/nav_item.html
<li class="nav-item">
<a class="nav-link {% if is_active %}active{% endif %}" href="{% url url_name %}">{{ link_name }}</a>
</li>
これは、基本的なbootstrapレンダリングしたいnavアイテムです。
Href値、およびオプションでlink_name値を取得します。 is_active
は、現在の要求に基づいて計算されます。
templatetags/nav.py
from Django import template
register = template.Library()
@register.inclusion_tag('fnf/nav_item.html', takes_context=True)
def nav_item(context, url_name, link_name=None):
return {
'url_name': url_name,
'link_name': link_name or url_name.title(),
'is_active': context.request.resolver_match.url_name == url_name,
}
次に、ナビゲーションで使用します:templates/fnf/nav.html
{% load nav %}
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<ul class="navbar-nav mr-auto">
{% nav_item 'dashboard' %}
</ul>
Jqueryを使用してnavbarを強調表示しました。このソリューションは、CSSセレクターに適合するアイテムにCSSクラス「アクティブ」を追加するだけです。
<script type="text/javascript" src="/static/js/jquery.js"></script>
<script>
$(document).ready(function(){
var path = location.pathname;
$('ul.navbar a.nav[href$="' + path + '"]').addClass("active");
});
</script>
私の解決策は、リクエストパスに基づいて変数を設定する単純なコンテキストプロセッサを作成することでした。
def navigation(request):
"""
Custom context processor to set the navigation menu pointer.
"""
nav_pointer = ''
if request.path == '/':
nav_pointer = 'main'
Elif request.path.startswith('/services/'):
nav_pointer = 'services'
Elif request.path.startswith('/other_stuff/'):
nav_pointer = 'other_stuff'
return {'nav_pointer': nav_pointer}
(カスタムプロセッサをsettings.pyのTEMPLATE_CONTEXT_PROCESSORSに追加することを忘れないでください。)
次に、ベーステンプレートで、リンクごとにifequalタグを使用して、「アクティブな」クラスを追加するかどうかを決定します。このアプローチはパス構造の柔軟性に厳密に制限されていますが、比較的控えめな展開では機能します。
元のソリューションのちょうど別の改良。
これは複数のパターンを受け入れます。また、次のように、 '"'でラップされた相対URLとして記述された名前のないパターンが最適です。
{% url admin:clients_client_changelist as clients %}
{% url admin:clients_town_changelist as towns %}
{% url admin:clients_district_changelist as districts %}
<li class="{% active "/" %}"><a href="/">Home</a></li>
<li class="{% active clients %}"><a href="{{ clients }}">Clients</a></li>
{% if request.user.is_superuser %}
<li class="{% active towns districts %}">
<a href="#">Settings</a>
<ul>
<li><a href="{{ towns }}">Towns</a></li>
<li><a href="{{ districts }}">Districts</a></li>
</ul>
</li>
{% endif %}
タグは次のようになります。
from Django import template
register = template.Library()
@register.tag
def active(parser, token):
args = token.split_contents()
template_tag = args[0]
if len(args) < 2:
raise template.TemplateSyntaxError, "%r tag requires at least one argument" % template_tag
return NavSelectedNode(args[1:])
class NavSelectedNode(template.Node):
def __init__(self, urls):
self.urls = urls
def render(self, context):
path = context['request'].path
for url in self.urls:
if '"' not in url:
cpath = template.Variable(url).resolve(context)
else:
cpath = url.strip('"')
if (cpath == '/' or cpath == '') and not (path == '/' or path == ''):
return ""
if path.startswith(cpath):
return 'active'
return ""
私はnivhabの投稿に対するマイナーな機能強化を共有したかっただけです。私のアプリケーションにはサブナビゲーションがあり、CSSだけを使用して非表示にしたくないので、アイテムのサブナビゲーションを表示するかどうかに何らかの「if」タグが必要でした。
from Django import template
register = template.Library()
@register.tag
def ifnaviactive(parser, token):
nodelist = parser.parse(('endifnaviactive',))
parser.delete_first_token()
import re
args = token.split_contents()
template_tag = args[0]
if len(args) < 2:
raise template.TemplateSyntaxError, "%r tag requires at least one argument" % template_tag
return NavSelectedNode(args[1:], nodelist)
class NavSelectedNode(template.Node):
def __init__(self, patterns, nodelist):
self.patterns = patterns
self.nodelist = nodelist
def render(self, context):
path = context['request'].path
for p in self.patterns:
pValue = template.Variable(p).resolve(context)
if path == pValue:
return self.nodelist.render(context)
return ""
これは、基本的にアクティブタグと同じ方法で使用できます。
{% url product_url as product %}
{% ifnaviactive request product %}
<ul class="subnavi">
<li>Subnavi item for product 1</li>
...
</ul>
{% endifnaviactive %}
アンドレアスの答えを少し変更すると、urls.pyからテンプレートタグへのルートの名前を渡すことができるようです。私の例ではmy_tasks
を使用し、テンプレートタグ関数でreverse関数を使用してURLがどうあるべきかを判断し、それをリクエストオブジェクト(テンプレートコンテキストで使用可能)のURLと照合することができます。
from Django import template
from Django.core.urlresolvers import reverse
register = template.Library()
@register.tag
def active(parser, token):
args = token.split_contents()
template_tag = args[0]
if len(args) < 2:
raise template.TemplateSyntaxError, "%r tag requires at least one argument" % template_tag
return NavSelectedNode(args[1:])
class NavSelectedNode(template.Node):
def __init__(self, name):
self.name = name
def render(self, context):
if context['request'].path == reverse(self.name[1]):
return 'active'
else:
return ''
rls.py
url(r'^tasks/my', my_tasks, name = 'my_tasks' ),
template.html
<li class="{% active request all_tasks %}"><a href="{% url all_tasks %}">Everyone</a></li>
私はパーティーに遅れていることを知っています。私は人気のあるソリューションはどれも好きではありませんでした:
ブロックメソッド は間違っているようです。ナビゲーションは自己完結型である必要があると思います。
template_tag method は間違っているようです。最初にurl-tagからurlを取得する必要があるのが好きではありません。また、css-classはタグではなくテンプレートで定義する必要があると思います。
したがって、上記で説明した欠点のないフィルターを作成しました。 URLがアクティブな場合はTrue
を返すため、{% if %}
で使用できます。
{% load navigation %}
<li{% if request|active:"home" %} class="active"{% endif %}><a href="{% url "home" %}">Home</a></li>
コード:
@register.filter(name="active")
def active(request, url_name):
return resolve(request.path_info).url_name == url_name
ナビゲーションのあるページで必ずRequestContext
を使用するか、settings.py
でリクエストcontext_processorを有効にしてください。
TEMPLATE_CONTEXT_PROCESSORS = (
...
'Django.core.context_processors.request',
)
これに触発されて solution 、私はこのアプローチを使い始めました:
**Placed in templates as base.html**
{% block tab_menu %}
<ul class="tab-menu">
<li class="{% if active_tab == 'tab1' %} active{% endif %}"><a href="#">Tab 1</a></li>
<li class="{% if active_tab == 'tab2' %} active{% endif %}"><a href="#">Tab 2</a></li>
<li class="{% if active_tab == 'tab3' %} active{% endif %}"><a href="#">Tab 3</a></li>
</ul>
{% endblock tab_menu %}
**Placed in your page template**
{% extends "base.html" %}
{% block tab_menu %}
{% with active_tab="tab1" %} {{ block.super }} {% endwith %}
{% endblock tab_menu %}
jpwatts '、 110j ' s、 nivhab 's& Marcus Whybrow の回答を見ましたが、それらはすべて何かに欠けているようです:ルートパスはどうですか?常にアクティブなのはなぜですか?
そのため、「コントローラー」が自動的に決定する他の方法をより簡単に作成し、ほとんどの大きな問題を解決できると思います。
カスタムタグは次のとおりです。
## myapp_tags.py
@register.simple_tag
def nav_css_class(page_class):
if not page_class:
return ""
else:
return page_class
次に、「コントローラー」は、必要なCSSクラスを宣言します(実際、最も重要なのは、その存在をテンプレートに宣言することです)
## views.py
def ping(request):
context={}
context["nav_ping"] = "active"
return render(request, 'myapp/ping.html',context)
そして最後に、ナビゲーションバーでレンダリングします。
<!-- sidebar.html -->
{% load myapp_tags %}
...
<a class="{% nav_css_class nav_home %}" href="{% url 'index' %}">
Accueil
</a>
<a class="{% nav_css_class nav_candidats %}" href="{% url 'candidats' %}">
Candidats
</a>
<a class="{% nav_css_class nav_ping %}" href="{% url 'ping' %}">
Ping
</a>
<a class="{% nav_css_class nav_stat %}" href="{% url 'statistiques' %}">
Statistiques
</a>
...
各ページには独自のnav_css_class
設定する値、および設定されている場合、テンプレートはアクティブになります。テンプレートコンテキストでrequest
は不要で、URL解析も、複数URLページまたはルートページに関する問題もありません。
これから SO Question
{% url 'some_urlpattern_name' as url %}
<a href="{{url}}"{% if request.path == url %} class="active"{% endif %}>Link</a>
リンクごとに必要に応じて繰り返します。
ここに非常に簡単な解決策があります https://github.com/hellysmile/Django-activeurl
インクルードテンプレート「intranet/nav_item.html」を作成します。
{% load url from future %}
{% url view as view_url %}
<li class="nav-item{% ifequal view_url request.path %} current{% endifequal %}">
<a href="{{ view_url }}">{{ title }}</a>
</li>
そして、それをnav要素に含めます:
<ul>
{% include "intranet/nav_item.html" with view='intranet.views.home' title='Home' %}
{% include "intranet/nav_item.html" with view='crm.views.clients' title='Clients' %}
</ul>
そして、これを設定に追加する必要があります。
from Django.conf import global_settings
TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + (
'Django.core.context_processors.request',
)
私のものは、以前に提出された別のJSアプローチに少し似ています。
Base.htmlに次のものがあるとします。
<div class="pure-u-1 pure-menu pure-menu-open pure-menu-horizontal header" >
<ul class="">
<li id="home"><a href="{% url 'article:index' %}">Home</a></li>
<li id="news"><a href="{% url 'article:index' %}">News</a></li>
<li id="analysis"><a href="{% url 'article:index' %}">Analysis</a></li>
<li id="opinion"><a href="{% url 'article:index' %}">Opinion</a></li>
<li id="data"><a href="{% url 'article:index' %}">Data</a></li>
<li id="events"><a href="{% url 'article:index' %}">Events</a></li>
<li id="forum"><a href="{% url 'article:index' %}">Forum</a></li>
<li id="subscribe"><a href="{% url 'article:index' %}">Subscribe</a></li>
</ul>
<script type="text/javascript">
(function(){
loc=/\w+/.exec(window.location.pathname)[0];
el=document.getElementById(loc).className='pure-menu-selected';
})();
</script>
</div>
特定のURLパターンに従うように階層を作成しました...ホストアドレスの後...ホーム、ニュース、分析などのメインカテゴリがあり、正規表現は最初のWordをその場所から引き出します
これが私の目標です。最終的には、ナビゲーション構造を含むビューにクラスを実装することになりました(いくつかのメタデータを含むフラット)。次に、これをテンプレートに挿入し、レンダリングします。
私のソリューションはi18nを扱います。おそらくもう少し抽象化する必要がありますが、私はそれを本当に気にしませんでした。
views.py:
from Django.utils.translation import get_language, ugettext as _
class Navi(list):
items = (_('Events'), _('Users'), )
def __init__(self, cur_path):
lang = get_language()
first_part = '/' + cur_path.lstrip('/').split('/')[0]
def set_status(n):
if n['url'] == first_part:
n['status'] == 'active'
for i in self.items:
o = {'name': i, 'url': '/' + slugify(i)}
set_status(o)
self.append(o)
# remember to attach Navi() to your template context!
# ie. 'navi': Navi(request.path)
このようなインクルードを使用してテンプレートロジックを定義しました。基本テンプレート:
{% include "includes/navigation.html" with items=navi %}
実際のインクルード(includes/navigation.html):
<ul class="nav">
{% for item in items %}
<li class="{{ item.status }}">
<a href="{{ item.url }}">{{ item.name }}</a>
</li>
{% endfor %}
</ul>
うまくいけば、誰かがこれを役に立つと思うでしょう!ネストされた階層などをサポートするためにそのアイデアを拡張するのはかなり簡単だと思います。
また、jQueryを使用して強調表示し、非セマンティックDjangoテンプレートタグでテンプレートを乱雑にするよりもエレガントであることがわかりました。
以下のコードは、bootstrap 3のネストされたドロップダウンで動作します(親と子の両方の<li>
要素を強調表示します。
// DOM Ready
$(function() {
// Highlight current page in nav bar
$('.nav, .navbar-nav li').each(function() {
// Count the number of links to the current page in the <li>
var matched_links = $(this).find('a[href]').filter(function() {
return $(this).attr('href') == window.location.pathname;
}).length;
// If there's at least one, mark the <li> as active
if (matched_links)
$(this).addClass('active');
});
});
テンプレート/ htmlマークアップを変更せずに、現在のページのclick
イベントをreturn false
に追加(またはhref
属性を#
に変更)することも非常に簡単です。
var matched_links = $(this).find('a[href]').filter(function() {
var matched = $(this).attr('href') == window.location.pathname;
if (matched)
$(this).click(function() { return false; });
return matched;
}).length;
クラスベースのビューには、このミックスインの組み合わせを使用します。
class SetActiveViewMixin(object):
def get_context_data(self, **kwargs):
context = super(SetActiveViewMixin, self).get_context_data(**kwargs)
context['active_nav_menu'] = {
self.request.resolver_match.view_name: ' class="pure-menu-selected"'
}
return context
テンプレートでこれを使用して:
<ul>
<li{{active_nav_menu.node_Explorer }}><a href="{% url 'node_Explorer' '' %}">Explore</a></li>
<li{{active_nav_menu.node_create }}><a href="{% url 'node_create' path %}">Create</a></li>
<li{{active_nav_menu.node_edit }}><a href="{% url 'node_edit' path %}">Edit</a></li>
<li{{active_nav_menu.node_delete }}><a href="{% url 'node_delete' path %}">Delete</a></li>
</ul>