django 导航,需要有关将 tags.py 文件放在哪里的帮助
django Navigation, need help on where to put the tags.py file
我正在尝试做 Ben Liyanage 对使用标签在 Django 中处理导航的回答。这是我正在阅读的 link Navigation in django。
我试图在我的项目中使用它来学习如何在 Django 中进行导航。例如,当我打开 login.html 时,出现以下错误:
'tags' 不是有效的标签库:未找到模板库标签,已尝试 django.templatetags.tags、django.contrib.admin.templatetags.tags、django.contrib.staticfiles.templatetags.tags
我实际上不确定 tags.py 文件应该放在哪里。
这是我的文件路径和代码:
## file path
-- Main project folder
-- manage.py
-- .. other files ..
-- src
-- urls.py
-- .. other files ..
-- templates
-- base.html
-- app folder
-- templates
-- app name
-- index.html
-- login.html
-- register.html
-- tags.py
-- .. other files ..
## urls.py
from django.conf.urls import patterns, url
from game import views
urlpatterns = patterns('',
url(r'^$', views.index, name='index'),
url(r'^upload/$', views.upload_file, name='upload'),
url(r'^successful_upload/$', views.successful_upload, name='successful_upload'),
url(r'^play/$', views.play, name='play'),
url(r'^registration/$', views.register, name='register'),
url(r'^successful_registeration/$', views.successful_registeration, name='successful_registeration'),
url(r'^login/$', views.login, name='login'),
url(r'^logout/$', views.logout, name='logout')
)
## tags.py
from django import template
register = template.Library()
@register.tag
def active(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, 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"
return ""
## base.html
{% load tags %}
{% url 'index' as home %}
{% url 'upload' as upload %}
{% url 'play' as play %}
{% url 'register' as contact %}
{% url 'login' as login %}
<div id="navigation">
<a class="{% active request home %}" href="{{ home }}">Home</a>
<a class="{% active request upload %}" href="{{ upload }}">Upload</a>
<a class="{% active request play %}" href="{{ play }}">Play</a>
<a class="{% active request contact %}" href="{{ contact }}">Contact</a>
<a class="{% active request login %}" href="{{ login }}">Login</a>
</div>
## login.html
{% extends "base.html" %}
{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
<form action="/game/login/" method="post">
{% csrf_token %}
<table border='0'>
<div class="fieldWrapper"><tr><td>
{{ form.user_name.errors }}</td><td></td></tr><tr><td>
<label for="id_user_name">User Name:</label></td><td>
{{ form.user_name }}</td></tr>
</div>
<div class="fieldWrapper"><tr><td>
{{ form.password.errors }}</td><td></td><tr><td>
<label for="id_password">Password:</label></td><td>
{{ form.password }}</td></tr>
</div>
</table>
<input type="submit" value="Login" />
</form>
您应该在您的应用程序文件夹下创建一个 templatetags
包并将 tags.py
放入其中:
project_folder/
app_folder/
__init__.py
models.py
templatetags/
__init__.py
tags.py
views.py
不要忘记在 templatetags
目录中包含一个空的 __init__.py
文件,否则 Python 解释器会认为它是一个普通目录,而不是 Python 包.有关详细信息,请参阅 https://docs.djangoproject.com/en/1.7/howto/custom-template-tags/。
我正在尝试做 Ben Liyanage 对使用标签在 Django 中处理导航的回答。这是我正在阅读的 link Navigation in django。
我试图在我的项目中使用它来学习如何在 Django 中进行导航。例如,当我打开 login.html 时,出现以下错误: 'tags' 不是有效的标签库:未找到模板库标签,已尝试 django.templatetags.tags、django.contrib.admin.templatetags.tags、django.contrib.staticfiles.templatetags.tags
我实际上不确定 tags.py 文件应该放在哪里。 这是我的文件路径和代码:
## file path
-- Main project folder
-- manage.py
-- .. other files ..
-- src
-- urls.py
-- .. other files ..
-- templates
-- base.html
-- app folder
-- templates
-- app name
-- index.html
-- login.html
-- register.html
-- tags.py
-- .. other files ..
## urls.py
from django.conf.urls import patterns, url
from game import views
urlpatterns = patterns('',
url(r'^$', views.index, name='index'),
url(r'^upload/$', views.upload_file, name='upload'),
url(r'^successful_upload/$', views.successful_upload, name='successful_upload'),
url(r'^play/$', views.play, name='play'),
url(r'^registration/$', views.register, name='register'),
url(r'^successful_registeration/$', views.successful_registeration, name='successful_registeration'),
url(r'^login/$', views.login, name='login'),
url(r'^logout/$', views.logout, name='logout')
)
## tags.py
from django import template
register = template.Library()
@register.tag
def active(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, 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"
return ""
## base.html
{% load tags %}
{% url 'index' as home %}
{% url 'upload' as upload %}
{% url 'play' as play %}
{% url 'register' as contact %}
{% url 'login' as login %}
<div id="navigation">
<a class="{% active request home %}" href="{{ home }}">Home</a>
<a class="{% active request upload %}" href="{{ upload }}">Upload</a>
<a class="{% active request play %}" href="{{ play }}">Play</a>
<a class="{% active request contact %}" href="{{ contact }}">Contact</a>
<a class="{% active request login %}" href="{{ login }}">Login</a>
</div>
## login.html
{% extends "base.html" %}
{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
<form action="/game/login/" method="post">
{% csrf_token %}
<table border='0'>
<div class="fieldWrapper"><tr><td>
{{ form.user_name.errors }}</td><td></td></tr><tr><td>
<label for="id_user_name">User Name:</label></td><td>
{{ form.user_name }}</td></tr>
</div>
<div class="fieldWrapper"><tr><td>
{{ form.password.errors }}</td><td></td><tr><td>
<label for="id_password">Password:</label></td><td>
{{ form.password }}</td></tr>
</div>
</table>
<input type="submit" value="Login" />
</form>
您应该在您的应用程序文件夹下创建一个 templatetags
包并将 tags.py
放入其中:
project_folder/
app_folder/
__init__.py
models.py
templatetags/
__init__.py
tags.py
views.py
不要忘记在 templatetags
目录中包含一个空的 __init__.py
文件,否则 Python 解释器会认为它是一个普通目录,而不是 Python 包.有关详细信息,请参阅 https://docs.djangoproject.com/en/1.7/howto/custom-template-tags/。