day65
参考:https://www.cnblogs.com/liwenzhou/p/8296964.html
Django框架的设计模式借鉴了MVC框架的思想,也是分成三部分,来降低各个部分之间的耦合性。
Django框架的不同之处在于它拆分的三部分为:Model(模型)、Template(模板)和View(视图),也就是MTV框架。
Django的MTV模式
Model(模型):负责业务对象与数据库的对象(ORM)
Template(模版):负责如何把页面展示给用户
View(视图):负责业务逻辑,并在适当的时候调用Model和Template
此外,Django还有一个urls分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template
Django框架图示
模板
详细参考:http://www.cnblogs.com/liwenzhou/p/7931828.html
常用语法
官方文档:https://docs.djangoproject.com/en/1.11/ref/templates/builtins/#std:templatetag-for
只需要记两种特殊符号:
{{ }}和 {% %}
变量相关的用{{}},逻辑相关的用{%%}。
a.目前学过的模板语言
b.其他
1 class Person(object): 2 def __init__(self, name, age): 3 self.name = name 4 self.age = age 5 6 def dream(self): 7 return "执行方法(只能调用不带参数的方法)" 8 def __str__(self): 9 return "<Person Object: {}>".format(self.name) 10 # 模板语言测试 11 def template_test(request): 12 file_size = 12345678 13 from datetime import datetime 14 now = datetime.now() 15 name = "小黑" 16 age = 18 17 a_html = "<a href='http://www.douban.com'>我是后端的a标签</a>" 18 script_html = "<script>for(var i=0;i<100;i++){alert(123);}</script>" 19 name_list = ["嘟嘟", "劳斯莱斯", "牛奶"] 20 name_list2 = [["啦啦0", "李伟师0", "薯片0"], ["嘟嘟1", "劳斯莱斯1", "牛奶1"]] 21 name_dict = {"first_name": "fuck", "last_name": "shit"} 22 p1 = Person("alex", 56) 23 p2 = Person("lulu", 18) 24 p_list = [p1, p2] 25 p_str = '''世界的眼睛、红楼梦、繁华、追风筝的人、巴别塔之犬''' 26 return render( 27 request, 28 "t_test.html", 29 { 30 "name": name, 31 "age1": age, 32 "name_list": name_list, 33 "name_list2": name_list2, 34 "name_dict": name_dict, 35 "p1": p1, 36 "p2": p2, 37 "p_list": p_list, 38 "file_size": file_size, 39 "now": now, 40 "a_html": a_html, 41 "script_html": script_html, 42 "p_str": p_str 43 } 44 )
模板中支持的写法:
Filters(过滤器)
自定义filter
自定义过滤器只是带有一个或两个参数的Python函数:
- 变量(输入)的值 - -不一定是一个字符串
- 参数的值 - 这可以有一个默认值,或完全省略
例如,在过滤器{{var | foo:'bar'}}中,过滤器foo将传递变量var和参数“bar”。
在app01下新建一个名为templatetags的package
myfilter.py
1 from django import template 2 register = template.Library() 3 4 # 告诉Django的模板语言我现在有一个自定义的filter方法,名字叫sb 5 @register.filter(name="sb") 6 def add_sb(arg): 7 return "{} sb啊.".format(arg) 8 9 10 # 告诉Django的模板语言我现在有一个自定义的filter方法,名字叫addstr 11 @register.filter(name="addstr") #告诉html用addstr这个名字可以调用这个方法 12 def add_str(arg, arg2): 13 """ 14 第一个参数永远是管道符前面那个变量 15 :param arg: 道符前面那个变量 16 :param arg2: 冒号后面的变量 17 :return: 18 """ 19 return "{} {}.".format(arg, arg2)
实践:
Tags
<p>for循环</p> <ul> {% for name in name_list %} {% if forloop.last %} {# forloop.revcounter 当前循环的倒序索引值(从1开始)#} <li class="dsb">{{ forloop.revcounter }}-{{ name }}</li> {% else %} <li class="{% if forloop.first %}'sb'{% endif %}">{{ forloop.revcounter }}-{{ name }}</li> {% endif %} {% endfor %} </ul> <hr> <p>双层循环</p> {% for name in name_list2 %} {% for name1 in name %} {# {{ forloop.parentloop.counter }}#} {# {{ forloop.counter }}#} {{ name1 }} {% endfor %} {% endfor %} <hr> <p>if/ elif/ else</p> {% if p3 %} <p>p3:{{ p3 }}</p> {% elif p2 %} <p>p2:{{ p2 }}</p> {% else %} <p>什么人都没有!</p> {% endif %} <hr> {#计算列表长度#} {% if name_list|length >= 3 %} <p>需要打两辆车</p> {% else %} <p>一辆足矣!</p> {% endif %} <hr> <p>with语句</p> {{ name_list2.1.1 }} {% with name=name_list2.1.1 %} {# 定义一个中间变量,多用于给一个复杂的变量起别名。#} {{ name }} {% endwith %} <hr>
结果:
数据库中找不到数据时显示: