0%

Django-模板学习(持续更新)

MVT框架中,Model已经完成,View会使用了,接下来是Template-模板。

静态资源

配置文件夹

在与manage.py同级别的位置新建一个存放静态资源的文件夹

添加映射url

settings.py
1
2
3
4
5
6
7
8
9
"""
省略
"""
STATIC_URL = '/static/' # '/static/'是指uri,映射下面的static目录。
# 在文件末尾添加以下内容
STATICFILES_DIRS = [
# 指定文件目录,BASE_DIR指的是项目目录,static是指存放静态文件的目录。
os.path.join(BASE_DIR, 'static'),
]

测试

在static文件夹下新建index.html,启动项目访问

http://127.0.0.1:8000/static/index.html

若不报错则配置正常。

模板配置

Django中返回页面需要用到渲染:render。

新建目录

与static文件夹同一个目录

配置路径

settings.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
- 'DIRS': [],
+ 'DIRS': [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',
],
},
},
]

如果使用的是pycharm,强迫症同学可以配置一下模板文件的目录让它变成紫色

image-20200707181151507

coding

在templates下新建一个html文件,

然后:

1
2
def index(request):
return render(request, 'page1.html')

添加url映射的部分自行完成

测试

启动项目,若能访问则正常

Django模板语言

Django的模板语言(DTL)可以动态渲染生成html,它的语法请参考 官方文档 这里只做简单的示例。

向模板传递参数

page1.html
1
2
3
4
5
6
7
8
9
10
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>page1</title>
</head>
<body>
Hello,{{ admin }}!
</body>
</html>
views.py
1
2
def index(request):
return render(request, 'page1.html', {'admin': 'wei'})

image-20200707182635984

引用静态资源

这里有两种方式:

  1. 找一张名为1.png的图片放在static文件夹下
  2. 编写页面
page1.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{% load static %}  <!--从staticfiles中导入静态文件-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>page1</title>
</head>
<body>
Hello,{{ admin }}!
<br/>
<!--使用硬编码的方式请求图片,如果配置中的STATIC_URL的uri改变,这种硬编码的形式就加载不到资源-->
<img src="/static/1.png" alt="image"/>
<br/>
<!--使用映射的方式加载图片,可以避免uri短链接改变导致图片资源加载不到的问题,要用这种方式,需要导入第一行-->
<img src="{% static '1.png' %}" alt="image"/>
</body>
</html>

DTL深入学习

DTL 标签

基本格式:

1
2
{% 代码段 %}
{# 注释段 #}

for循环:

1
2
3
4
5
6
7
8
9
10
11
12
{#for循环遍历列表#}
{% for i in 列表 %}
#列表不为空时执行
{% empty %}
#列表为空时执行
{% endfor %}

{#若加上关键字reversed则倒序遍历:#}
{% for x in 列表 reversed %}
{% endfor %}

{#在for循环中可以通过{{ forloop.counter }}得到for循环遍历到几次#}

if判断

1
2
3
4
5
6
{#判断语句:#}
{% if %}
{% elif %}
{% else %}
{% endif %}
{#使用比较运算符时候两边必须有空格#}

多行注释

1
2
{% comment %}
{% endcomment %}

DTL if语句

page1.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{% load static %}  <!--从staticfiles中导入静态文件-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>page1</title>
</head>
<body>
Hello,{{ admin }}!<br/>
{#<!--使用硬编码的方式请求图片,如果配置中的STATIC_URL的uri改变,这种硬编码的形式就加载不到资源-->#}
{#<img src="/static/1.png" alt="image"/>#}
{#<br/>#}
{#<!--使用映射的方式加载图片,可以避免uri短链接改变导致图片资源加载不到的问题,要用这种方式,需要导入第一行-->#}
{#<img src="{% static '1.png' %}" alt="image"/>#}
{% if age < 18 %}
<p>你还没有成年</p>
{% elif age == 18 %}
<p>你刚刚成年</p>
{% else %}
<p>你已经成年了</p>
{% endif %}
</body>
</html>

``为DTL的注释标记,html源码中不可查看

views.py
1
2
def index(request):
return render(request, 'page1.html', {'admin': 'wei', 'age': int(request.GET.get('age'))})

image-20200707184045837

DTL 继承

模板里编写{% block <demo> %}开头,{% endblock %}结尾处,代表可以被继承.

  1. 父模板:

    father.html
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    </head>
    <body>

    {% block demo %}
    <h1>模板1</h1>
    {% endblock %}

    {% block demo1 %}
    <h1>模板2</h1>
    {% endblock %}

    </body>
    </html>
  2. 子模板

    son,html
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    </head>
    <body>
    {% extends 'father.html' %} {# 继承模板 #}

    {% block demo %} {# 对引入的模板块进行从写 #}
    <h1>这里是重写</h1>
    {% endblock %}
    </body>
    </html>
    1
    2
    def index(request):
    return render(request, 'son.html')

image-20200707185605829

-----------看到底线啦 感谢您的阅读-------------