DjangoでTagとFilterをカスタマイズ(一)
19517 ワード
ここはカスタムTagのDemoです.プロジェクトとappを作成します.django-admin.py startproject DynamicNavコマンドを使用して、DynamicNavという名前のDjangoプロジェクトを作成し、manage.py startapp navを使用してDynamicNavディレクトリにappを作成します. ディレクトリを作成します.テンプレートに格納するためにDynamicNavディレクトリにtemplatesのディレクトリを作成します.DynamicNavディレクトリの下に、静的ファイルを保存するためのmediasディレクトリを作成します.DynamicNav/Navディレクトリの下にtemplatetagsというディレクトリを作成し、カスタムtagを保存しながらtemplatetagsディレクトリに__という名前のディレクトリを作成します.init__.pyのファイルで、Djangoにこのディレクトリに格納されているソースコードを説明します. テンプレートを作成します.templatesディレクトリにnav.htmlのテンプレートファイルを作成します.このファイルではCSS+DIVを使ってナビゲーションバーを簡単に実現しています.CSS、DIVに関する知識は、その文章を参考にすることができます.テンプレートのソースコードは次のとおりです: nav.html:
このコードは、次の効果のナビゲーションバーを定義します.
4、nav/view.pyファイルを変更します.navのview.pyファイルを簡単に書きます.
ここではrequestをパラメータとしてテンプレートに転送します.
5、urls.pyとsetting.pyファイルを修正する.
urls.pyを開いたら、次のように変更します(怠け者で、そんなに多くのページを書いていません.すべてのリンクは1つのページを使用しています).
setting.pyのN箇所を修正する:
1)templatesの絶対パスをTEMPLATE_に追加DIRS中です.次の文を使用します.
os.path.join(os.path.dirname(__file__),'templates').replace('\\','/'),
import osを忘れないでね.
2)MEDIA_をROOT変更:MEDIA_ROOT = os.path.join(os.path.dirname(__file__),'medias').replace('\\','/')
3)INSTALLED_でAPPSに「DynamicNav.nav」という行を追加して、さっき作ったアプリをインストールします.
4)Context Processorを追加します.setting.pyの最後に以下を加えればOKです.
TEMPLATE_CONTEXT_PROCESSORS = (
"django.core.context_processors.request",
"django.core.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
)
OK manage.py runserverを実行して開くことができますhttp://127.0.0.1:8000運行効果を見てみましょう.
6、次はカスタムタグの作成をします.皆さん、よく見てくださいね~~
Nav/templatetagsにNavTag.pyというファイルを作成し、変更を開始します.
ここで、黒い文字は修正された部分です.{%load NavTag%}カスタムtagファイルをロードするため、Djangoはappの下のtemplatetagsディレクトリを自動的に削除してNavTag.pyファイルを検索します.{%navtagitem/「トップページ」%}タグを使用してナビゲーションバーを定義するには、トップページの2文字の間にスペースがあるため、二重引用符で起こさなければなりません.起こさなければ、Djangoはnavtagitemラベルに3つのパラメータが伝達されたと考えられ、TemplateSyntaxErrorが生成されます.
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title> </title>
- <link href="/site_media/style.css" rel="stylesheet" type="text/css" />
- </head>
- <body>
- <ul id="nav">
- <li><a href="/" id="current"> </a></li>
- <li><a href="/article/" > </a></li>
- <li><a href="/blog/" >Blog</a></li>
- <li><a href="/forum/" > </a></li>
- <li><a href="/about/" > </a></li>
- </ul>
- </body>
- </html>
このテンプレートはすぐに修正する必要があります.焦らないでください~~~.Mediasディレクトリの下にcssファイルを作成します:style.css:
- body
- {
- background-color:#FFFFFF;
- }
-
- #nav
- {
- height:26px;
- border-bottom:2px solid #ccc;
- list-style:none;
- }
-
- #nav li
- {
- float:left;
- font-size:14px;
- }
-
- #nav li a
- {
- color:#03b;
- text-decoration:none;
- display:block;
- width:88px;
- height:19px;
- text-align:center;
- background:url(bg.gif) no-repeat;
- margin-left:8px;
- padding-top:6px;
- }
-
- #nav li a:hover
- {
- font-weight:bold;
- }
-
- #nav li a#current
- {
- background:url(cur.gif) no-repeat;
- color:#666;
- font-weight:bold;
- height:20px;
- }
このコードは、次の効果のナビゲーションバーを定義します.
4、nav/view.pyファイルを変更します.navのview.pyファイルを簡単に書きます.
- #coding=utf-8
-
- from django.shortcuts import render_to_response
- from django.template import RequestContext
-
- def index(request):
- return render_to_response('nav.html', {}, RequestContext(request))
ここではrequestをパラメータとしてテンプレートに転送します.
5、urls.pyとsetting.pyファイルを修正する.
urls.pyを開いたら、次のように変更します(怠け者で、そんなに多くのページを書いていません.すべてのリンクは1つのページを使用しています).
- from django.conf.urls.defaults import *
- import settings
-
- urlpatterns = patterns('',
- (r'^$', 'DynamicNav.nav.views.index'),
- (r'^article/$', 'DynamicNav.nav.views.index'),
- (r'^blog/$', 'DynamicNav.nav.views.index'),
- (r'^forum/$', 'DynamicNav.nav.views.index'),
- (r'^about/$', 'DynamicNav.nav.views.index'),
- #define the media url
- (r'^site_media/(?P<path>.*)$', 'django.views.static.serve', {'document_root' : settings.MEDIA_ROOT}),
- )
setting.pyのN箇所を修正する:
1)templatesの絶対パスをTEMPLATE_に追加DIRS中です.次の文を使用します.
os.path.join(os.path.dirname(__file__),'templates').replace('\\','/'),
import osを忘れないでね.
2)MEDIA_をROOT変更:MEDIA_ROOT = os.path.join(os.path.dirname(__file__),'medias').replace('\\','/')
3)INSTALLED_でAPPSに「DynamicNav.nav」という行を追加して、さっき作ったアプリをインストールします.
4)Context Processorを追加します.setting.pyの最後に以下を加えればOKです.
TEMPLATE_CONTEXT_PROCESSORS = (
"django.core.context_processors.request",
"django.core.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
)
OK manage.py runserverを実行して開くことができますhttp://127.0.0.1:8000運行効果を見てみましょう.
6、次はカスタムタグの作成をします.皆さん、よく見てくださいね~~
Nav/templatetagsにNavTag.pyというファイルを作成し、変更を開始します.
- #coding=utf-8
- from django import template
-
- #
- register = template.Library()
-
- # Tag Node ,
- class NavTagItem(template.Node):
- def __init__(self, nav_path, nav_displaytext):
- self.path = nav_path.strip('"')
- self.text = nav_displaytext.strip('"')
-
- def render(self, context):
- cur_path = context['request'].path
- #context['request'] views request ,
- # context
-
- current = False
- if self.path == '/':
- current = cur_path == '/'
- else:
- current = cur_path.startswith(self.path)
-
- cur_id = ''
- if current:
- cur_id = ' id="current" '
-
- return '<li><a %s href="%s">%s</a></li>' % (cur_id, self.path, self.text)
-
- # tag, ,
- @register .tag(name='NavTag')
- def navtagitem(parser, token):
- try:
- tag_name, nav_path, nav_text = token.split_contents()
- except ValueError:
- raise template.TemplateSyntaxError, \
- "%r tag requires exactly two arguments: path and text" % \
- token.split_contents[0]
-
- return NavTagItem(nav_path, nav_text)
、nav.htmlファイルを再変更します.nav.htmlファイルを変更するには、次のようにします.
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title> </title>
- <link href="/site_media/style.css" rel="stylesheet" type="text/css" />
- </head>
- <body>
- {% load NavTag %}
- <ul id="nav">
- {% navtagitem / " " %}
- {% navtagitem /article/ " " %}
- {% navtagitem /blog/ "Blog" %}
- {% navtagitem /forum/ " " %}
- {% navtagitem /about/ " " %}
- </ul>
- </body>
- </html>
ここで、黒い文字は修正された部分です.{%load NavTag%}カスタムtagファイルをロードするため、Djangoはappの下のtemplatetagsディレクトリを自動的に削除してNavTag.pyファイルを検索します.{%navtagitem/「トップページ」%}タグを使用してナビゲーションバーを定義するには、トップページの2文字の間にスペースがあるため、二重引用符で起こさなければなりません.起こさなければ、Djangoはnavtagitemラベルに3つのパラメータが伝達されたと考えられ、TemplateSyntaxErrorが生成されます.