Django 自定义模板标签(template_tags)究竟有什么用?

自定义模板标签,过滤器。英文翻译是Custom template tags and filterscustom filter自定义过滤器今天不在我的记录范围之内,以后用到再看官方文档也不迟。

**问题1:**custom template tags 到底长啥样?
custom template tags—github
Many template tags take a number of arguments – strings or template variables – and return a result after doing some processing based solely on the input arguments and some external information. For example, a current_time tag might accept a format string and return the time as a string formatted accordingly.

To ease the creation of these types of tags, Django provides a helper function, simple_tag. This function, which is a method ofdjango.template.Library, takes a function that accepts any number of arguments, wraps it in a render function and the other necessary bits mentioned above and registers it with the template system.

(为了降低custom tags的难度,你可以使用Django提供的快捷函数simple_tag)

Our current_time function could thus be written like this:

import datetime
from django import template

register = template.Library()# 只有向系统注册过的tags,系统才认得你。

@register.simple_tag(takes_context=True)#加上这句后我就是一名合格的template tags
def current_time(context, format_string):
    timezone = context['timezone']
    return your_get_current_time_method(timezone, format_string)

Note that the first argument must be called context.
Note that the first argument must be called context.
Note that the first argument must be called context.

@register.simple_tag(takes_context=True)
# 这个装饰器表明这个函数是一个模板标签,takes_context = True 表示接收上下文对象,就是前面所说的封装了各种变量的 Context 对象。
def paginate(context, object_list ,page_count):
    # context是Context 对象,object_list是你要分页的对象,page_count表示每页的数量 , page_count

    left = 3  # 当前页码左边显示几个页码号 -1,比如3就显示2个
    right = 3  # 当前页码右边显示几个页码号 -1

    paginator = Paginator(object_list, page_count)  # 通过object_list分页对象

    page = context['request'].GET.get('page')  # 从 Http 请求中获取用户请求的页码号

    try:
        object_list = paginator.page(page)  # 根据页码号获取第几页的数据

        context['current_page'] = int(page)  # 把当前页封装进context(上下文)中
        pages = get_left(context['current_page'], left, paginator.num_pages) + get_right(context['current_page'], right,
                                                                                         paginator.num_pages)
        # 调用了两个辅助函数,根据当前页得到了左右的页码号,比如设置成获取左右两边2个页码号,那么假如当前页是5,则 pages = [3,4,5,6,7],当然一些细节需要处理,比如如果当前页是2,那么获取的是pages = [1,2,3,4]

    except PageNotAnInteger:
        # 异常处理,如果用户传递的page值不是整数,则把第一页的值返回给他
        object_list = paginator.page(1)
        context['current_page'] = 1  # 当前页是1
        pages = get_right(context['current_page'], right, paginator.num_pages)
    except EmptyPage:
        # 如果用户传递的 page 值是一个空值,那么把最后一页的值返回给他
        object_list = paginator.page(paginator.num_pages)
        context['current_page'] = paginator.num_pages  # 当前页是最后一页,num_pages的值是总分页数
        pages = get_left(context['current_page'], left, paginator.num_pages)

    context['article_list'] = object_list  # 把获取到的分页的数据封装到上下文中
    context['pages'] = pages  # 把页码号列表封装进去
    context['last_page'] = paginator.num_pages  # 最后一页的页码号
    context['first_page'] = 1  # 第一页的页码号为1
    try:
        # 获取 pages 列表第一个值和最后一个值,主要用于在是否该插入省略号的判断,在模板文件中将会体会到它的用处。注意这里可能产生异常,因为pages可能是一个空列表,比如本身只有一个分页,那么pages就为空,因为我们永远不会获取页码为1的页码号(至少有1页,1的页码号已经固定写在模板文件中)
        context['pages_first'] = pages[0]
        context['pages_last'] = pages[-1] + 1
        # +1的原因是为了方便判断,在模板文件中将会体会到其作用。

    except IndexError:
        context['pages_first'] = 1  # 发生异常说明只有1页
        context['pages_last'] = 2  # 1 + 1 后的值

    return ''  # 必须加这个,否则首页会显示个None

问题2:自定义完标签后,在模板中怎么使用呢?
Django 自定义模板标签(template_tags)究竟有什么用?_第1张图片
我的自定义过的标签放在templatetags/paginate_tags.py中
这里写图片描述
处理函数

{% load paginate_tags %}#第一步:把文件名包含进来
{% paginate blogposts 2 %} #第二步:调用函数 添加参数。注意context参数不用你传。

注意:
经由def paginate(context, object_list ,page_count):函数处理过的数据,在模板中如何使用???

    context['article_list'] = object_list  # 把获取到的分页的数据封装到上下文中
    context['pages'] = pages  # 把页码号列表封装进去
    context['last_page'] = paginator.num_pages  # 最后一页的页码号
    context['first_page'] = 1  # 第一页的页码号为1

数据输送到函数中,进行处理,然后将数据封装到之前的context上下文变量中,供template使用,使用方式和使用字典一样。

你可能感兴趣的:(Djngo/Django部署,数据库设计)