模板的渲染
在1.2中Django的url通过return来返回网站的相关内容,返回html的话示例代码如下
from django.shortcuts import render
def temp(request):
return render(request,'index.html')
注意,render中的request参数毕需传入,有了render函数之后,就可以摒弃掉之前用的HttpResponse函数了,其实render函数之中也调用了HttpResponse。
模板查找路径
在Django项目的配置文件setting.py中TEMPLATES变量列表中可以找到如下的代码
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
其中 DIRS 规定了首先查找的位置,代码中python语言,意思就是在本项目的templates中找寻,没有找到的话会到如下的路径中查找,就在本变量的上面。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'front',
]
可以把创建的app导入,然后在app中构建目录templates,那么就会到我们的app中找,最后一行就是我在项目中构建的front前端app,其实可以把路径中的DIRS改为空,因为我们一般在进行网站开发的时候,前端和后端是分离的,如果都有index页面或者其他的相同的名字的模板的话,是一件非常麻烦的事情,所以,习惯性的删除主项目中的templates和查找的路径,然后再添加自己子app的相关路径。
参数传递
在render函数中可以用context进行参数传递,ctrl+B可以看一下函数的原型。
def render(request, template_name, context=None, content_type=None, status=None, using=None):
"""
Return a HttpResponse whose content is filled with the result of calling
django.template.loader.render_to_string() with the passed arguments.
"""
content = loader.render_to_string(template_name, context, request, using=using)
return HttpResponse(content, content_type, status)
第三个参数context就可以传入参数,其中参数可以以字典的方式进行呈现。
eg:
views.py
def temp(request):
context = {
'username': "小明"
}
return render(request,'index.html',context=context)
index.html
<p>{{ username }}</p>
直接通过字典的key来打印变量。
if语句
框架如下,大致语法和python相似,但是注意对于列表的引用,需要以 user.0 代替 user[0]
{% if username=='小明' %}
{% elif %}
{% else %}
{% endif %}
eg:
{% if '1' in person %}
<p>测试if 是</p>
{% else %}
<p>测试if 否</p>
{% endif %}
for语句
框架如下,大致语法和python也差不多
{% for person in person %}
{% endfor %}
eg:
{% for person in person %}
<p>编号:{{ forloop.counter }} 内容: {{ person }}</p>
{% endfor %}
for语句拓展:
{% forloop.counter %} # 计数从1开始
{% forloop.counter0 %} # 计数从0开始
{% forloop.first %} # 是否是第一个
{% forloop.last %} # 是否是最后一个
{% empty %} # 如果列表为空,渲染下面的代码
url跳转
总结以上,需要新添加一个页面的话有两步:
- views.py中写好一个函数
- urls.py中做好path路径的映射就可以了
但是如果在模板中跳转的话就需要另外再加一步了,就是模板中的url跳转,一般情况下url跳转都在a标签中,语法如下:
<a href="{% url 'app_name:views中的name' %}">Book</a>
有两点需要注意
- app_name如果你的项目中有多个子app,那么给不同的app命名之后,一定要加上app_name之后冒号加映射path的name,不然会踩坑。
- 同样的像上一篇Django1.2一样,对于映射的路径,最好给一个name这样方便修改,这里用的就是name
参数传递
views.py
def book_id(request,book_id):
text = '图书ID为:%s' % book_id
return HttpResponse(text)
urls.py
path('book/detail/<book_id>',views.book_id,name='detail'),
index.html
<a href="{% url 'front:detail' book_id='菜徐坤' %}">传参跳转</a>
字符串查询
views.py
def book_li(request):
text = request.GET.get('li')
return HttpResponse(text)
urls.py
path('book/li/',views.book_li,name='li')
index.html 注意查询字符串的位置
<li class="breadcrumb-item"><a href="{% url 'front:li' %}?li=a">?查询字符串跳转</a></li>
总结url跳转三板斧就可以搞定一个跳转了。
- 构建页面
- url映射
- 模板页面加链接
date过滤器
需要传入date类型的数据,可以使用python的datetime库来获取时间
{{ today|date:"Y/m/d" }}
模板继承
对于HTML中页面的共有部分可以写成一个父模板,然后子模版通过继承的方式来继承父模板,就可以省去很多代码。
base.html 父模板
<div class="container">
{% block content %}
/*这里的content是block的名字,可以进行修改,子模版中要一致*/
/*这里是接口 在子模版中可以向此处填充进内容*/
{% endblock %}
</div>
index.html 子模版
extends为父模板的路径,然后注意block的名字要和父模板中对应的接口一致。
{% extends 'base.html' %}
{% block content %}
<div>这是front文件中的</div>
{% endblock %}
静态文件的加载
django中可以使用相对路径的形式加载静态文件,也可以只用django提供的方法,需要注意三点
- 加载进来static标签
- 文件的路径一定要是static
- 如果static文件在子app中,那么这个app一定得配置到setting的INSTALLED_APPS中
{% static '...' %}
需要在页面中加载进来static标签即可,加载方法
{% load static %}
当然,如果页面比较多的话,每个页面都要加上面的一行代码,很不舒服,所以可以在
setting–>TEMPLATES–>'OPTIONS’中加入
'builtins':['django.templatetags.static']
就可以自动为所有html配置static标签。