Django 常用模板标签

255 阅读3分钟

if标签:

if标签与python中的if语句相同,但是所有的标签都需要({%%})进行包裹并且需要闭合标签。示例如下:

{% if age < 18 %}
        <p>你是未成年人,不能进入网吧</p>
    {% elif age == 18 %}
        <p>欢迎光临</p>
    {% else %}
        <p>适度游戏</p>
    {% endif %}

for in empty标签:

基本操作与上面一样,当遍历为空时,执行empty里面的操作 for..in..中没有continue和break关键字 示例如下:

   <p>
        {% for key,value in person.items %}
            {{ key }}:{{ value }}
        {% endfor %}
    </p>
    <table>
        <thead>
            <tr>
                <td>序号</td>
                <td>书名</td>
                <td>作者</td>
                <td>价格</td>
            </tr>
        </thead>
        <tbody>
        {% for book in books %}
            {% if forloop.first %}
                <tr style="background: red;">
            {% elif forloop.last %}
                <tr style="background: pink;">
            {% else %}
                <tr>
            {% endif %}
                <td>{{ forloop.counter0 }}</td>
                <td>{{ book.name }}</td>
                <td>{{ book.author }}</td>
                <td>{{ book.price }}</td>
            </tr>
        {% endfor %}
        </tbody>
    </table>
    <ul>
        {% for content in contents %}
            <li>{{ content }}</li>
        {% empty %}
            <li>没有任何评论</li>
        {% endfor %}
    </ul>

url标签

url标签给文本一个超链接,示例如下:

views部分:

from django.shortcuts import render
from django.http import HttpResponse

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

def login(request):
    next = request.GET.get('next')
    text = '登陆完成要跳转的页面是%s'%(next)
    return HttpResponse(text)

def book(request):
    return HttpResponse('读书页面')

def book_detail(request,book_id):
    text = '你的书籍详情是:%s'%(book_id)
    return HttpResponse(text)

def movie(request):
    return HttpResponse('电影页面')

def city(request):
    return HttpResponse('同城页面')

urls部分

from . import views
urlpatterns = [
    path('',views.index,name='index'),
    path('book/',views.book,name='book'),
    path('movie/',views.movie,name='movie'),
    path('city/',views.city,name='city'),
    path('book/detail/<book_id>/',views.book_detail,name='detail'),
    path('login/',views.login,name='login'),
]

hmtl模板部分

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .nav{
            overflow: hidden;
        }
        .nav li{
            float: left;
            list-style: none;
            margin: 0 20px;
        }
    </style>
</head>
<body>
    <ul class="nav">
        <li><a href="/">首页</a> </li>
        <li><a href="{% url 'book' %}">读书</a> </li>
        <li><a href="{% url 'movie' %}">电影</a> </li>
        <li><a href="{% url 'city' %}">同城</a> </li>
        <li><a href="{% url 'detail' book_id='1' %}">最火的一篇文章</a> </li>
        <li><a href="{% url 'login'  %}?next=/">登录</a> </li>
    </ul>
</body>
</html>

添加 <a{% url '唯一id' %}>属性</a为属性添加一个超连接,点击属性时跳转到该id指定的页面

在url 中添加参数直接以空格 参数名=为其赋值 ,查询字符串要在尾端自行添加

模板常用过滤器

在DTL中不支持函数调用形式,因此不能给函数传递参数,这将有很大的局限,而过滤器其实就是一个函数,可以接受一个参数,对其进行处理。

add过滤器

add 过滤器会尝试将传进来的参数变为整形然后返回和,如果不行则会尝试字符串凭借和序列拼接

 {{ '1'|add:'2' }}

cut过滤器

cut 过滤器会移除所指定的字符串

{{'HELLO WORLD'|cut:' '}}

date过滤器

date 过滤器应用格式符将时间序列格式化

 {{ today|date:'Y/m/d H:i:s' }}

模板继承

将需要重复利用的代码放入同一个模板,调用extends继承,示例如下:

bases模板

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .nav{
            overflow: hidden;
        }
        .nav li{
            float: left;
            list-style: none;
            margin: 0 20px;
        }
    </style>
</head>
<body>
<header>
    <ul>
        <li>{{ username }}</li>
    </ul>
    <ul class="nav">
        <li><a href="/">首页</a></li>
        <li><a href="{% url 'company' %}">公司</a> </li>
        <li><a href="{% url 'school' %}">学校</a> </li>
    </ul>
</header>
<div class="content">
    {% block content %}
        这是父模板中的代码

    {% endblock %}
</div>
<footer>
    这是footer部分
</footer>
</body>
</html>

子模板继承

{% extends 'bases.html' %}

对于不同的页面,可以使用block标签开个口子,为其赋名,然后在子模板里面调用名字即可进行创造,示例如下:

bases.html开口子的地方

<div class="content">
    {% block content %}
    {% endblock %}
</div>

子模板中调用

{% block content %}
    这是首页的代码
{% endblock %}

这相当于重写了父模板中开口子的这部分,所以父模板中这部分代码不会显现,如果想利用这部分代码,类似于python类继承,使用block.super即可调用,示例如下:

{% block content %}
    {{ block.super }}
    这是首页的代码
{% endblock %}

加载静态文件

在一个网页中,不仅需要html骨架,还需要css样式文件,js执行文件以及一些图片等。在DTL中,使用static标签来加载静态文件,首先需要{% load static %},步骤如下:

1.首先确保django.control.staticfiles已经添加到settings.INSALLED_APP中。

2.确保在settings.py中设置了STATIC_URL.(请求静态文件的url)

3.在已安装的app下创建一个文件叫做static,再在static文件夹下新建一个与当前app名相同的文件夹,再把静态文件放到这个文件夹下。(避免各app下出现同名静态文件时识别错误)

4.如果一些静态文件是不和任何app挂钩的,那么可以在settings.py中添加STATICFILES_DIRS,以后DTL就会在这个列表路径中查找静态文件。比如:

STATICFILES_DIRS = [
	os.path.join(BASE_DIR,'static')
]

5.在模板中使用load标签加载static标签。比如要加载在项目的static文件夹下的stytle.css的文件,示例如下

{% load static %}
<img src="{% static 'front/view.jpg' %}" alt="">

6.如果不想每次在模板加载静态文件都使用load加载static,可以在settings中的TEMPLATES/OPTIONS中添加'builtins':['diango.templatetags.static'],这样模块就能直接使用static标签。

7.如果没有在INSTALLD_APP中添加 django.contrib.staticfiles。那么我们需要手动将静态文件的url与静态文件的路径进行映射。