框架-Django-模版继承和自定义过滤器

Django下静态模板的继承

前言:第一篇博客,毕业校招在即,抽空把做过的项目都整理一下。 
开发环境:python3.4,django1.8 
初入python和django做项目,遇到很多前端页面代码冗余的情况,特别是头部和脚部,代码都是一样的。最开始是代码一直复制粘贴,后来发现Django自带的模板继承很好用。本人新手,仅发表个人经验,确实觉得很受用。欢迎大家指导。

①. 定义一个基础模板,该框架之后由子模板继承。

命名为base.html,这个页面主要放公用部分的代码,各个子页面都可以继承这个页面的样式。

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>{% block title %}首页{% endblock %}</title>
   {% block js %} {% endblock %}
   {% block css %}  {% endblock %}
</head>
<body>  
   {% block content %}{% endblock %}
</body>
</html>

②. 编写各个子模板

如下所示,{% extends ‘base.html’ %}作为基础模板,必须放在第一行才可以识别。 
{% block %}这个标签,告诉模板引擎,子模板可以重载这些 
{% include %}允许模板中包含其他模板。 
注意css和js等静态文件,是和html不同的识别方式。

{% extends 'base.html' %}
<!-- 该页面不允许出现js以及css代码,content代码可直接写在本文件中,下面只是content的实例代码 -->
{% block title %}
   <!-- 此处写页面标题 -->
{% endblock %}

{% block js %}
    <!-- 此处填充js链接 -->
    <script type="text/javascript" src="..."></script>
{% endblock %}

{% block css %}
    <!-- 此处填充css链接 -->
{% endblock %}

{% block content %}
    <!-- 此处填充页面主体内容 -->
    {% include 'taskApp/cjjdglContent.html' %}
{% endblock %}

这种方式用起来,不仅改起来便捷,代码量也显然减少了不少。

Django下自定义过滤器

Django中的模板过滤器强大又好用。当然如果你的项目是前后端分离,未用到模板,那也就不存在模板过滤器一说。

模板过滤器的作用是对从后台传进来的视图变量做一些值或格式上的改变。

Django中自带了非常多的过滤器,基本上够我们在项目中使用。

1.Django中的内置过滤器

例如:add:把add后面的参数加给value

{{value | add : "2"}}

value的值为4,则输出为6.

再例如:cut:移除value中所有与给定参数变量相同的字符

{{value | cut:" "}}

value"Hello world",则输出"Helloworld"(去掉了空格)。

不过,有时候根据业务需求我们要写自己的模板过滤器,下面我们来讲一下自定义模板过滤器。

2.自定义不带参数的过滤器

我在Markdown你的文章和代码高亮也用到了此类过滤器。例如,我们来实现一个叫做my_upper的过滤器,用来将字符串转化为大写形式(虽然Django已经实现了——upper)。

例如:

{{value | my_upper}}

value"Hello world",则输出"HEELO WORLD"

具体操作:在你的应用目录下新建一个名为templatetags的文件夹,在其内部新建__init__.py(可为空)和custom_filter.py这两个文件,编辑custom_filter.py

from django import template

register = template.Library()

@register.filter
def my_upper(value):
    try:
        value.upper()
    except Exception, e:
        return value

这样便将my_upper这个过滤器定义好了,在使用时不要忘了在模板文件头部写入{% load custom_filter %}

3.自定义带参数的过滤器

其实第一部分的两个例子便为带参数的过滤器,下面我们用代码来实现一下。

@register.filter
def get_value(mydict,key_name):
    assert(isinstance(mydict,dict))
    try:
        return mydict[key_name]
    except KeyError:
        return mydict

上面的代码意为以键的方式在字典中取值:

若试图函数views.py:

def index(request):
    dicts = {"key1" : 1, "key2" : 2, "key3" : 3 }
    return render(request, 'index.html', {'dicts': dicts})

在模板中的使用:

{{dicts | get_value : "key1"}}

输出为1.(结束)



posted @ 2017-11-16 21:57  byrony  阅读(132)  评论(0编辑  收藏  举报