6.Django模板

1.模板简介

Django作为一个web框架,需要有一种动态生成html的便捷方法。最常见的就是使用模板。
模板包含所需HTML输出的静态部分以及描述动态内容将被插入的一些特殊语法。
Django的模版是很灵活的,可以使用内置也可以使用JiCAN2.

2.模板的配置

我们打开项目目录下的setting.py文件。
找到TEMPLATES。

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        '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',
            ],
        },
    },
]

BACKEND:告诉Django使用哪个模版引擎。DjangoTemplates是默认的, 还可以选django.template.backends.jinja2.Jinja2。还可以自定义,在这里我们使用默认的就行。
DIRS:是模版放置的路径定义
APP_DIRS: 是否在每个app里面查找模版
OPTIONS:其他可选项。

3.实战

上面我没介绍了下模板,一般这些都不需要修改,使用默认就行了,进阶的时候就需要更多的配置。

打开views.py修改index视图。
1.首先导入包from django.shortcuts import render
2.在news文件夹下创建一个templates目录
3.新建一个index.html网页

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
今天学习模板
</body>
</html>

4.修改index函数

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

5.打开setting.py
添加我们的news app

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'news' #添加
]

启动项目。效果如下。

4.给模板传递数据

4.1字符串

修改index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{{ message }}
</body>
</html>

修改views.py的index

def index(request):
    message = '欢迎来到第八个部落,学习Django!!!'
    return render(request, 'index.html', {'message': message})

将在页面上显示欢迎来到第八个部落,学习Django!!!
在模版中我们使用了

{{message}}

同时在render函数中传递了一个字典。
普通的变量使用{{}}包裹。

4.2 for循环

views.py

def index(request):
    message = '欢迎来到第八个部落,学习Django!!!'

    languages = [
        'java', 'c/c++', 'python', 'css'
    ]

    return render(request, 'index.html', {'message': message, 'languages':languages})

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

{{ message }}

<ul>
    {% for language in languages %}
        <li>{{ language }}</li>
    {% endfor %}
</ul>
</body>
</html>

for循环跟python原始的基本一样,只是需要{%%}包裹,并且有个endfor.

4.3 显示字典

views.py

def index(request):
    message = '欢迎来到第八个部落,学习Django!!!'

    languages = [
        'java', 'c/c++', 'python', 'css'
    ]

    info_dict = {'site': '第八个部落', 'url': 'https://litets.com'}
    return render(request, 'index.html', {'message': message,
                                          'languages':languages,
                                          'info_dict':info_dict})

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

{#普通变量#}
{{ message }}

{#列表的渲染#}
<ul>
    {% for language in languages %}
        <li>{{ language }}</li>
    {% endfor %}
</ul>

{#字典的渲染#}
<ul>
    {% for key,value in info_dict.items %}
        <li>{{ key }} : {{ value }}</li>
    {% endfor %}

</ul>
</body>
</html>

本质上还是遍历list只是语法糖包装了一下。 [('site','第八个部落'), ('url','https://litets.com')]

4.4 条件判断

如果我们传递的参数,有问题怎么办?或者我们想根据一些条件显示不同的样式呢?
views.py

def index(request):
    message = '欢迎来到第八个部落,学习Django!!!'

    languages = [
        'java', 'c/c++', 'python', 'css'
    ]

    # info_dict = {'site': '第八个部落', 'url': 'https://litets.com'}
    return render(request, 'index.html', {'message': message,
                                          'languages':languages})

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

{#普通变量#}
{{ message }}

{#列表的渲染#}
<ul>
    {% for language in languages %}
        <li>{{ language }}</li>
    {% endfor %}
</ul>

{#字典的渲染#}
<ul>
    {% if info_dict %}
        {% for key,value in info_dict.items %}
            <li>{{ key }} : {{ value }}</li>
        {% endfor %}
    {% else %}
        info_dict 为空
    {% endif %}

</ul>
</body>
</html>

页面将会展示

info_dict 为空

if条件判读跟python中的一样 可以使用==, !=, >=, <=, >, < 注意不要连在一起了。 还可以使用python的and, or, not, in, not in

4.3 for加强

for循环信息

变量 描述
forloop.counter 索引从 1 开始算
forloop.counter0 索引从 0 开始算
forloop.revcounter 索引从最大长度到 1
forloop.revcounter0 索引从最大长度到 0
forloop.first 当遍历的元素为第一项时为真
forloop.last 当遍历的元素为最后一项时为真
forloop.parentloop 用在嵌套的 for 循环中,
获取上一层 for 循环的 forloop

我们修改index.html中的循环代码

{#列表的渲染#}
<ul>
    {% for language in languages %}
        {% if forloop.first %}
            我是第一条
        {% endif %}
        <li>{{ language }}</li>
        {% if forloop.last %}
            我是最后一条
        {% endif %}
    {% endfor %}
</ul>

展示效果
-----------------
我是第一条

  • java
  • c/c++
  • python
  • css 我是最后一条
    ------------------

for循环还可以像if中的else有分支

for ... empty ...
<ul>
    {% for language in languages %}
        {% if forloop.first %}
            我是第一条
        {% endif %}
        <li>{{ language }}</li>
        {% if forloop.last %}
            我是最后一条
        {% endif %}
    {% empty %} # 当没有数据的时候执行此分支
            没有数据
    {% endfor %}
</ul>

4.4其他内置变量

4.4.1获取当前用户

{{ request.user }}

{% if request.user.is_authenticated %}
    {{ request.user.username }},您好!
{% else %}
    请登陆
{% endif %}

4.4.2获取当前路径

{{ request.path }}

4.4.3获取参数

{{ request.GET.urlencode }}

下一节

7.Django模型与数据库

声明:原创文章,版权所有,转载请注明出处,https://litets.com。