关于django中模板的理解
2018/12/10 日课程总结
引子:不同于HttpResponse 返回的是一个字符串,后端开发自然是要返回的是一个页面。
首先在已经有html文件的情况下我们是如何将一个页面展示在页面呢。
- 首先新建一个templates的文件夹,目录最好与manage.py 文件同级
- 写好一个html文件放在其中
- 配置settings.py 文件
TEMPLATES:'DIRS': [os.path.join(BASE_DIR,"templates")],
- 下一步考虑如何渲染模板 这里提供了两种方法:
1. from django.template.loader import render_to_string
from django.http import HttpResponse
def index(request):
html = render_to_string("index.html")
return HttpResponse(html)
默认路径下找到模板,然后将模板编译后渲染成Python的字符串格式
2.from django.shortcuts import render
def index(request):
return render(request,'index.html')
直接将模板渲染成字符串和包装成HttpResponse对象一步到位完成.
Ps: render函数第一个参数与视图函数同样是requset 。
考虑两种方法中第三个可传参数的解释:
视图函数在使用render或者render_to_string的时候可以传递一个context的参数,这个参数是一个字典类型。以后在模板中的变量就从这个字典中读取值的
Example:
Index.html 代码
<p>{{ username }}</p>
# views.py 中的代码
def profile(request):
Return render(request,'index.html',context={'username':'lilei'})
常用标签总结:
if标签:if标签相当于Python中的if语句,有elif和else相对应,但是所有的标签都需要用标签符号({% %})进行包裹。if标签中可以使用==、!=、<、<=、>、>=、in、not in、is、is not等判断运算符。示例代码如下:
{% if "张三" in persons %}
<p>张三</p>
{% else %}
<p>李四</p>
{% endif %}
1. 所有的标签都是在{% %}之间。
2. if标签有闭合标签。就是{% endif %}。
3. if标签的判断运算符,就跟python中的判断运算符是一样的。==、!=、<、<=、>、>=、in、not in、is、is not这些都可以使用。
4. 还可以使用elif以及else等标签。
for...in...标签:for...in...类似于Python中的for...in...。可以遍历列表、元组、字符串、字典等一切可以遍历的对象。在index.html中示例代码如下:
该行为变形内容:翻转(逆序遍历) {% for person in persons reversed %}
{% for person in persons %}
<p>{{ person}}</p>
{% endfor %}
遍历字典的时候,需要使用items、keys和values等方法。在DTL中,执行一个方法不能使用圆括号的形式。遍历字典示例代码如下:
{% for key,value in person.items %}
<p>key:{{ key }}</p>
<p>value:{{ value }}</p>
{% endfor %}
for...in...empty标签:这个标签使用跟for...in...是一样的,只不过是在遍历的对象如果没有元素的情况下,会执行empty中的内容。示例代码如下:
{% for person in persons %}
<li>{{ person }}</li>
{% empty %}
暂时还没有任何人
{% endfor %}
模板中的for...in...没有continue和break语句,这一点和Python中有很大的不同,一定要记清楚!
with标签:在模版中定义变量。有时候一个变量访问的时候比较复杂,那么可以先把这个复杂的变量缓存到一个变量上,以后就可以直接使用这个变量就可以了。示例代码如下:
context = {
"persons": ["张三","李四"]
}
#在index.html中写
{% with lisi=persons.1 %}
<p>{{ lisi }}</p>
{% endwith %}
有几点需要强烈的注意:
1. 在with语句中定义的变量,只能在{% with %} {% endwith %}中使用,不能在这个标签外面使用。
2. 定义变量的时候,不能在等号左右两边留有空格。比如{% with lisi = persons.1%}是错误的。
还有另外一种写法同样也是支持的:
{% with persons.1 as lisi %}
<p>{{ lisi }}</p>
{% endwith %}
url标签:在模版中,我们经常要写一些url,比如某个a标签中需要定义href属性。当然如果通过硬编码的方式直接将这个url写死在里面也是可以的。但是这样对于以后项目维护可能不是一件好事。因此建议使用这种反转的方式来实现,类似于django中的reverse一样。示例代码如下:
<a href="{% url 'list' %}">图书列表页面</a>
如果url反转的时候需要传递参数,那么可以在后面传递。但是参数分位置参数和关键字参数。位置参数和关键字参数不能同时使用。示例代码如下:
# path部分
path('detail/<book_id>/',views.book_detail,name='detail')
# url反转,使用位置参数
<a href="{% url 'detail' 1 %}">图书详情页面</a>
# url反转,使用关键字参数
<a href="{% url 'detail' book_id=1 %}">图书详情页面</a>
如果想要在使用url标签反转的时候要传递查询字符串的参数,那么必须要手动在在后面添加。示例代码如下:
<a href="{% url 'detail' book_id=1 %}?page=1">图书详情页面</a>
如果需要传递多个参数,那么通过空格的方式进行分隔。示例代码如下:
<a href="{% url 'detail' book_id=1 page=2 %}">图书详情页面</a>