django入门(八)自定义Tag

django入门(八)自定义Tag

阅读别人的中文笔记
http://www.woodpecker.org.cn/obp/django/django-stepbystep/newtest/doc/

step by step(十五)i18n的一些东东,先略过吧。
step by step(十六)
1.Tag执行过程
作者描述的Tag执行过程,如果要自定义 Tag ,那么要了解 Tag 的处理过程。在 Django 中, Tag 的处理分为两步。
1.编译。即把 Tag 编译为一系列的 django.template.Node 结点。
2.渲染(Render)。即对每个 Node 调用它们的 render() 方法,然后将输出结果拼接起来。
2.下载对应的资源
下载地址如下:
http://py-templates.sourceforge.net/
其中我们要用到的是:
HTMLTemplate http://py-templates.sourceforge.net/htmltemplate/index.html
HTMLCalendar http://py-templates.sourceforge.net/htmlcalendar/index.html
下载得到的文件,我们都切换到root用户,然后揭开压缩:
tar zxvf 文件名
然后切换到文件夹中,用如下命令来安装:
python setup.py install

3.创建my_calendar应用,并新建py文件
python manage.py startapp my_calendar
/my_calendar/templatetags/__init__.py
/my_calendar/templatetags/my_calendar.py
my_calendar.py文件的内容如下:
from django import template
register = template.Library()
class CalendarNode(template.Node):
def __init__(self):
pass
def render(self, context):
return "Calendar"
def do_calendar(parser, token):
return CalendarNode()
register.tag('calendar', do_calendar)

4.新建html模板文件
/template/my_calendar/calendar.html,内容如下:
{% load my_calendar %}
{% calendar 2010 2 %}

5.修改urls.py映射和settings.py增加这个模块:
(r'^calendar/$', 'django.views.generic.simple.direct_to_template',{'template': 'my_calendar/calendar.html'}),

INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.admin',
'easydjango.wiki',
'easydjango.address',
'easydjango.ajax',
'easydjango.my_calendar',
)

6.启动服务后,访问地址http://localhost:8000/calendar/,能看到
Calendar
这个目前只是测试了,能调用到我们自定义的tag,但是没有什么意义,应为没有对输入输出进行处理。
修改my_calendar.py文件,对这些进行处理
from django import template
import HTMLCalendar

register = template.Library()

class CalendarNode(template.Node):
def __init__(self, year, mon):
self.year = int(year)
self.mon = int(mon)

def render(self, context):
return HTMLCalendar.MonthCal().render(self.year, self.mon)

def do_calendar(parser, token):
try:
print token.contents
tag_name, arg = token.contents.split(None, 1)
except ValueError:
#if no args then using current date
import datetime
today = datetime.date.today()
year, mon = today.year, today.mon
else:
try:
year, mon = arg.split(None, 1)
except ValueError:
raise template.TemplateSyntaxError, "%r tag requires year and mon arguments" % tag_name

return CalendarNode(year, mon)

register.tag('calendar', do_calendar)
刷新刚才的测试页面,能看到如下的结果:
February
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28

step by step(十七)
笔记的原作者,对各个模块的理解:
View ----->Template------>Tag
这个简单笔记到了这里就看完了,下一部考虑看一边英文原文的文档,另外考虑做个简单的python应用
放到google app上。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值