ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Django - 模版 - 补充

2020-12-27 13:31:59  阅读:164  来源: 互联网

标签:name 补充 模版 Django models html 标签 django 模板


目录

什么是模板系统

模板是一个文本, 用于分离文档的表现形式和内容.

变量

  • 大括号百分号包围的文本称为变量(例如 {% person_name %})

模板标签

for标签

  • 大括号百分号包围的文本(例如 : {% for item in itme_list %}).

if标签

  • 例如 : {% if ordered_warranty %}.

ifequal

  • {% ifequal %} 标签比较两个值, 当他们相等时, 显示在{% ifequal %}{% endifequal %}之中所有的值
  • 例如 : 比较两个模板变量user和currentuser.
{% ifequal user currentuser %}
	<h1>Welecome!</h1>
{% endifequal  %}
  • {% ifequal %}支持可选的{% else %} 标签
{% ifequal section 'sitenews' %}
    <h1>Site News</h1>
{% else %}
   	<h1>No News Here</h1>
{% endifequal %}

只有模板变量, 字符串, 整数小数可以作为{% ifequal %}标签的参数.

注释

注释使用 {##}, 这种语法的注释不能跨越多行.
多行注释使用 {% comment %}{% endcomment %}标签

过滤器

  • 过滤器使用管道字符, 如 :

    • {{ name|lower }}: 显示的内容是变量{{ name }}被过滤器lower处理后的结果, 它的作用是转换文本为小写.
  • 过滤管道可以被套接, 也就是说, 一个过滤管道的输出可以作为下一个管道的输入, 如 :

    • {{ my_list|first|upper }} : 它的作用是, 取第一个字段, 取到以后转换为大写.
  • 有些过滤器有参数, 过滤器的参数跟随冒号之后用双引号包含, 如:

    • {{ bio|truncateword:"30" }} (Django2.0 变成了 {{ bio|truncatechars:"30" }})

一些常用的过滤器

  • addslashes : 添加反斜杠到任何反斜杠、单引号或者双引号前面
  • date : 按指定的格式字符串参数格式化 date 或者 datetime 对象
  • length : 返回变量的长度.

如何使用模板系统

  1. 用指定模板文件路径的方式创建Template对象
  2. 调用模板对象的render方法, 并且传入一套变量context, 它将返回一个基于模板的展现字符串, 模板中的变量和标签会被context值替换

在视图中使用模板

模板应该和视图实现分离, 可以把模板放到一个单独的文件中, 并且让视图加载该文件.

创建templates文件放置html文件

模板加载

为了减少模板加载调用过程及模板本身的冗余代码, Django提供了一个API, 用于从磁盘中加载模板.

配置settings文件

TEMPLATES = [
    {
        'DIRS': [
            os.path.join(BASE_DIR, 'templates')
        ],
    },
]

render_to_response()

Django提供一个了render_to_response()函数, 可以一次性的载入某个模板文件, 渲染它, 然后将此作为HttpResponse返回.

  • 使用render_to_response()
from django.shortcuts import render_to_response
import datetime

def current_datetime(request):
	now = datetime.datetime.now()
	return render_to_response('current_datetime.html', {'current_date': now})

locals()

  • locals()内建函数返回的字典对所有局部变量的名称与值进行映射. 视图可以重新为 :
def home(request):
    date = datetime.datetime.now()
    return render(request, 'home.html', locals())

模板继承

定义基础模板

  • 将基础模板命名为base.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}{% endblock %}</title>
</head>
<body>
    {% block content %}{% endblock %}
    {% block footer %}
    <hr>
    <p>Thanks for visiting my site.</p>
    {% endblock %}
</body>
</html>

{% block %} 标签告诉引擎, 子模板可以重载这些部分

修改home.html模板

{% extends "base.html" %}

{% block title %}我的网站{% endblock %}
{% block content %} 现在的时间是{{ date }} {% endblock %}

模板继承工作方式

在加载home.html模板时, 模板引擎发现了{% extends %} 标签. 标记这个模板是一个子模板, 模板引擎立即装载其父模板 base.html
模板引擎用子模板的内容替换父模板中的block
由于子模板并没有定义footer块, 模板系统将使用父模板中定义的值.

继承模板三层法

  1. 创建base.html 模板, 这些都是不常修改甚至从不修改的部分
  2. 为网站的每个区域创建 base_SECTION.html模板 ( 例如, base_photos.htmlbase_forum.html), 这些模板对base.html进行拓展, 并包含区域特定的风格与设计
  3. 为每种类型的页面创建独立的模板

模板继承的注意事项

  1. 如果在模板 中使用 {% extends %}, 必须保证其为模板中的第一个模板标记.
  2. 如果需要父模板中的块的内容, 可以用 {{ block.super }} 标签. 也就是说, 引入对应block后,在其前后,都可以增加相应的内容
  3. 不允许在同一个模板中定义多个同名的 {% block %}.

配置mysql数据库

setting.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST': '127.0.0.1',
        'PORT': '3306',
        'NAME': 'mydb',
        'USER': 'lsf',
        'PASSWORD': 'fei1028',
    }
}

创建模型

一本书可以有几个作者,一个作者也可以有几本书,所以是manytomany; 一个出版社可以有很多书,但一本书只可以有一个出版社,所以是onetomany

models.py

from django.db import models

class Publisher(models.Model):
    name = models.CharField(max_length=30)
    address = models.CharField(max_length=50)
    city = models.CharField(max_length=60)
    state_province = models.CharField(max_length=30)
    country = models.CharField(max_length=50)
    website = models.URLField()

class Author(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=40)
    email = models.EmailField()

class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher)
    publication_date = models.DateField()

每个数据模型都是django.db.models.Model
每个数据模型相当于单个数据库表, 每个属性就是这个表中的一个字段.
它的类型相当于数据库的字段类型.

模型安装

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

使用 python manage.py check 检测模型有效性

添加数据

>>> from book.models import Publisher
>>> p1 = Publisher(name='Test', address='address', city='beijing', state_province='Beijing', country='china.', website='http://www.apress.com/')
>>> p1.save()

查询数据

>>> Publisher.objects.all()
<QuerySet [<Publisher: Publisher object (1)>]>

相当于SQL语句 :

SELECT id, name, address, city, state_province, country, website
FROM books_publisher;

数据过滤

使用filter()方法对数据进行过滤

>>> Publisher.objects.filter(name='Test')
<QuerySet [<Publisher: Publisher object (1)>]>

获取单个对象

使用 get() 方法返回单个对象, 如果结果是多个对象会抛出异常, 如果查询没有返回结果也会抛出异常

>>> Publisher.objects.get(name='Test')
<Publisher: Publisher object (1)>

数据排序

使用order_by()方法对查询结果进行排序

>>> Publisher.objects.order_by('name')
<QuerySet [<Publisher: Publisher object (1)>]>

可以使用class Meta 指定模型的排序方式:

class Meta:
	ordering = ['name']

修改单个字段

>>> Publisher.objects.filter(id=1).update(name='test1')
1

标签:name,补充,模版,Django,models,html,标签,django,模板
来源: https://blog.csdn.net/qq_33962481/article/details/111578706

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有