欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Day 06 模板层补充

程序员文章站 2022-05-22 23:30:52
...

Day 06 模板层补充

一、自定义标签和过滤器

1、自定义标签

1.1 配置文件路径

在setting中的INSTALL_APPS配置当前app,不然Django无法找到自定义的simple_tag

INSTALLED_APPS = [
    'django.contrib.staticfiles',
    'app01.apps.App01Config',  # 默认是配置好了的
]

1.2 创建可识别的自定义过滤器包

在app中创建templatetags包(包名只能是templatetags,不能改)

1.3 创建py文件

在包内创建py文件,这个名字没有限制

1.4 撰写过滤器代码

from django import template  #这其实只是一个接口,里面存放各种导入,没有实质代码
register = template.Library()  # 在template中转站中,实例化Library类
import re  # 正则 后面用到

@register.filter  # 装饰器调用filter方法
def my_add(a, b):
    res = a ** b
    return res


@register.filter()
def my_upper(value):
    if re.match('[a-z]', value):
        value = value.upper() + '_Dsb'  # type:str
        return value
    else:
        return value

1.5 使用方法–和给的相同

templates下面的index模板

            <tr>
                <td>Name</td>
                <td>Age</td>
                <td>Hobby</td>
                <td>Level</td>
                <td>Time</td>
            </tr>
            {% load my_tags %}  # 这里我们先要加载自定义的过滤器文件
            <tr>
                <td>{{'lgd'|my_upper }}</td>  
                <td>{{ 2|my_add:10 }}</td>
                <td>送菜下饭</td>
                <td>这波我再大气层</td>
                <td>剑指S11</td>
            </tr>

2、自定义标签

1.1 配置文件路径

在setting中的INSTALL_APPS配置当前app,不然Django无法找到自定义的simple_tag

INSTALLED_APPS = [
    'django.contrib.staticfiles',
    'app01.apps.App01Config',  # 默认是配置好了的
]

1.2 创建可识别的自定义过滤器包

在app中创建templatetags包(包名只能是templatetags,不能改)

1.3 创建py文件

在包内创建py文件,这个名字没有限制,(与过滤器写在了一起)

1.4 撰写过滤器代码

from django import template
register = template.Library()

@register.simple_tag  # 不同点
def my_csrf():
	import uuid
	res=uuid.uuid4()
	return mark_safe('<input type="hidden" name="csrfmiddlewaretoken" value="%s">'%res)

1.5 使用

{% load my_tags %}
{% my_csrf %}
{% my_tag 1 3 4 %}  

二、模板的导入和继承

1、模板的导入

1.1 新建一个xx.html文件,把写好的模板写入进去,或者找个好看的模板

!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/aaa@qq.com/dist/css/bootstrap.min.css"
          integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
    <title>beautiful_base</title>
</head>
<body>
<div class="row" style="background-color: #0087ff">
    <h1>Example heading <span class="label label-default">New</span></h1>
    <h2>Example heading <span class="label label-primary">New</span></h2>
    <h3>Example heading <span class="label label-success">New</span></h3>
    <h4>Example heading <span class="label label-info">New</span></h4>
    <h5>Example heading <span class="label label-warning">New</span></h5>
    <h6>Example heading <span class="label label-danger">New</span></h6>
</div>
</body>
</html>

Day 06 模板层补充

1.2 在想使用的地方

{% include ‘xxx.html ’ %}

        <tr>
            <td>{{'lgd'|my_upper }}</td>
            <td>{{ 2|my_add:10 }}</td>
            <td>送菜下饭</td>
            <td>这波我再大气层</td>
            <td>剑指S11</td>
        </tr>
    </table>
</div>
<hr class="my-4">
{% include 'beautiful_base.html' %}  # 在这里导入模板

Day 06 模板层补充

2 模板的继承

2.1 写一个母版,留一个空盒子位置

​ {% block top %}
​ {% endblock %}

<body>
<div class="row" style="background-color: #0087ff">
    <h1>Example heading <span class="label label-default">New</span></h1>
    <h2>Example heading <span class="label label-primary">New</span></h2>
    <h3>Example heading <span class="label label-success">New</span></h3>
    <h4>Example heading <span class="label label-info">New</span></h4>
    <h5>Example heading <span class="label label-warning">New</span></h5>
    <h6>Example heading <span class="label label-danger">New</span></h6>
</div>
    	   {% block top %}
            
            {% endblock %}
</body>

2.2:某个页面要使用母版,引入,扩写盒子

​ {% extends ‘xxx.html’ %}
​ {% block top %}
​ index页面
​ {% endblock %}

<body>
{% extends 'beautiful_base.html' %}
{% block footer %}
    <form class="form-inline">
        <h1><p>这是我新添加的表单</p></h1>
        <div class="form-group">
            <label for="exampleInputName2">Name</label>
            <input type="text" class="form-control" id="exampleInputName2" placeholder="Jane Doe">
        </div>
        <div class="form-group">
            <label for="exampleInputEmail2">Email</label>
            <input type="email" class="form-control" id="exampleInputEmail2" placeholder="aaa@qq.com">
        </div>
        <button type="submit" class="btn btn-default">Send invitation</button>
    </form>
{% endblock %}
</body>

三、静态文件相关

1. 第一种

配置静态文件 逐级导入

<img src="/static/img/1.jpg" style="width: 300px">

**注意:**这种方法在浏览器 无痕模式 下 会失效 一些链接无法引入

2. 第二种

注意{% load static %}需要放在html的头部位置(至少在使用static标签的上面),一般都是放在html的最上面。如果{% extend %}标签和{% load static %}同时存在,{% extend %}需要放在最上面,然后再放{% load static %}等标签。

{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css' %}">

3. 第三种

{% load static %}
<img src="{% get_static_prefix %}img/3.jpg" style="width: 300px">

四、inclusion_tag的使用

可以生成一片模板中的代码块

# my_tags
@register.inclusion_tag('inclusion_tag.html')
def tags():
    now = datetime.datetime.now()
    dic = {'Name': 'TES',
           'Age': 'S10',
           'Hobby': 'Heart',
           'Level': 'One',
           'Time': now,
           'Last': 'Super'}
    # 固定返回的必须是字典
    print(dic)
    return {'data': dic}

这是创建的与之相关的html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/aaa@qq.com/dist/css/bootstrap.min.css"
          integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
    <title>Title</title>
</head>
<body>
<div class="row" style="background-color: #0087ff">
    <h1>{{ data.Name }}<span class="label label-default">New</span></h1>
    <h2>{{ data.Age }} <span class="label label-primary">New</span></h2>
    <h3>{{ data.Hobby }} <span class="label label-success">New</span></h3>
    <h4>{{ data.Level }} <span class="label label-info">New</span></h4>
    <h5>{{ data.Time }} <span class="label label-warning">New</span></h5>
    <h6>{{ data.Last }} <span class="label label-danger">New</span></h6>
</div>
</body>
</html>

使用

只能作为插入使用,不能单独使用,将装饰器使用的html文件导入到其他的模板中使用,单独使用没有效果的,像这样

{% extends 'beautiful_base.html' %}
{% load static %}
{% block footer %}
    {% load my_tags %}  # 已导入
    <form class="form-inline">
        <h1><p>这是我新添加的表单</p></h1>
        <div class="form-group">
            <label for="exampleInputName2">Name</label>
            <input type="text" class="form-control" id="exampleInputName2" placeholder="Jane Doe">
        </div>
        <div class="form-group">
            <label for="exampleInputEmail2">Email</label>
            <input type="email" class="form-control" id="exampleInputEmail2" placeholder="aaa@qq.com">
        </div>
    </form>
     {% tags %}  # 在这里掉用
{% endblock %}

Day 06 模板层补充

五、 字段和字段参数介绍

class Book(models.Model):
    # 如果不写id,会默认一个id,并且自增
    #primary_key=True  表示该字段是主键,一个表中只能由一个主键
    # id = models.AutoField(primary_key=True)
    # varchar类型,长度,
    # 字段是否可以为空:null=True,可以为空
    # 默认值:default='未知书名',如果没传,默认是它
    # 设置索引:db_index=True 表示该字段是辅助索引
    # 是否唯一:unique=True 表示唯一
    name=models.CharField(max_length=32,null=True,default='未知书名',db_index=True,unique=True)
    # float类型
    # max_digits 最大长度是5  4567.5
    # decimal_places=2 小数点后两位   23.56     999.99
    price=models.DecimalField(max_digits=5,decimal_places=2)

    # DateTimeField年月日时分秒
    # auto_now=True  新增,默认使用当前时间
    # auto_now_add=True 修改,设置当前时间
    publish_date=models.DateTimeField(auto_now=True)

    publish=models.CharField(max_length=32)

六、 单表增加

两种方式
第一种:
    models.Book.objects.create(name='xxx',price=10.34,publish='南京出版社')

第二种:
    book=models.Book(name='yyy',price=11.34,publish='南京出版社')
    book.save()

七、 单表查询(开个头)

# 查询名字叫xxx的书

from app01 import models
def books(request):
    # models.Book.objects.create(name='xxx',price=10.34,publish='南京出版社')
    #
    #
    # book=models.Book(name='yyy',price=11.34,publish='南京出版社')
    # book.save()

    # 查询所有
    res=models.Book.objects.all()
    print(res)
    # 查询名字叫xxx的书(是个列表:QuerySet)
    res = models.Book.objects.filter(name='xxx')
    res = models.Book.objects.filter(name='xxx')[0]
    res = models.Book.objects.filter(name='xxx').first()

    # 查询名字叫xxx的书(就是book对象),如果没有或者由多个,都报错
    # 查询结果必须有且仅有一个才正常,否则报错
    res=models.Book.objects.get(name='sss')

    # 

    print(res.name)
    return HttpResponse('两本书保存成功')