`
sillycat
  • 浏览: 2486678 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

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上。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics