Django 模板

* django的使用 * MVC 和 MTV * 模板

HTTP/1.1

超文本传输协议(英文:Hyper Text Transfer Protocol,HTTP

1.定义:

HTTP的发展是由蒂姆·伯纳斯-李于1989年在欧洲核子研究组织(CERN)所发起
HTTP/2标准于2015年5月以RFC 7540正式发表
现今广泛使用的一个版本——HTTP 1.1。

2.请求方法8种

1),GET: GET可以说是最常见的了,它本质就是发送一个请求来取得服务器上的某一资源。资源通过一组HTTP头和呈现数据(如HTML文本,或者图片或者视频等)返回给客户端。GET请求中,永远不会包含呈现数据。
2),HEAD: HEAD和GET本质是一样的,区别在于HEAD不含有呈现数据,而仅仅是HTTP头信息.欲判断某个资源是否存在,我们通常使用GET,但这里用HEAD则意义更加明确。
3), POST: 数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有
4),PUT: 和POST极为相似,都是向服务器发送数据,重要区别,PUT通常指定了资源的存放位置,而POST则没有,POST的数据存放位置由服务器自己决定
5),DELETE: 删除某一个资源。
6), TRACE: 追踪路径 回显服务器收到的请求,主要用于测试或诊断。
7),OPTIONS : 但极少使用。它用于获取当前URL所支持的方法。若请求成功,则它会在HTTP头中包含一个名为“Allow”的头,值是所支持的方法,如“GET, POST”。
8), CONNECT: 要求用隧道协议连接代理 HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。

get 和post 区别:

1)get不安全,数据是放在url地址栏上的
2)post是安全的,数据放在body中,在地址栏上不可见,
3)Get的url会有长度上的限制,传送的数据量小
4)Post的数据可以非常大
5)Get在form表单里是默认提交的

3.状态码

状态代码的第一个数字代表当前响应的类型:

  • 1xx消息——请求已被服务器接收,继续处理
  • 2xx成功——请求已成功被服务器接收、理解、并接受
  • 3xx重定向——需要后续操作才能完成这一请求 301重定向 302 永久重定向
  • 4xx请求错误——请求含有词法错误或者无法被执行
    404(未找到) 服务器找不到请求的网页 403服务器拒绝请求。 401代表访问的页面没授权
  • 5xx服务器错误——服务器在处理某个正确请求时发生错误
    502网络错误 504网关超时 505服务器不支持请求中所指明的HTTP版本 500服务器内部异常
**请求和响应的格式**
	请求(request  浏览器发给服务器的消息 )
		格式:
        		'请求方法 url路径 HTTP/1.1

			k1: v1

			k2: v2

			

			请求数据(请求体)'       get请求没有请求体
		
			
	响应(response  服务器发给浏览器的消息 )
		格式:
			'HTTP/1.1 状态码 状态描述

			k1: v1
       
			k2: v2

			

			响应体(HTML文本)'		

4.三件套

HttpResponse('内容')   ——》   字符串
render(request,'HTML文件名' ,{‘name’:’小兰’})   ——》  返回一个完整的HTML页面
在HTML里面{{name}}  用户得到的是小兰
redirect('重定向的地址')   ——》  重定向     响应头 Location:重定向的地址

form表单
1. form标签的属性 action='' method='post' action提交的地址 method 请求的方式
2. 所有的input标签要有name属性 有的还有value属性
3. 有一个type=submit input标签 或者 一个button按钮.

django的使用

如何使用

  1. 下载安装
    1. 命令行
    pip install django1.11.20
    pip install django
    1.11.20 -i 源
    2. pycharm
    settings——》 解释器 ——》 点+号 ——》 输入Django ——》 选择版本 ——》 安装

    1. 创建项目

      1. 命令行
        切换到存放项目的目录下cd
        django-admin startproject 项目名
      2. pycharm
        file ——》 new project ——》 django ——》 输入项目目录 ——》 选择解释器 ——》输入一个app名称 ——》创建
    2. 启动项目

      1. 命令行
        切换到项目根目录下cd manage.py
        python manage.py runserver # 127.0.0.1:8000
        python manage.py runserver 80 # 127.0.0.1:80
        python manage.py runserver 0.0.0.0:80 # 0.0.0.0:80

      2. pycharm
        点击绿三角
        配置中改 ip 和 端口
        4.settings配置
        静态文件
        STATIC_URL = '/static/' # 别名
        STATICFILES_DIRS = [
        os.path.join(BASE_DIR, 'static1'),
        os.path.join(BASE_DIR, 'static'),
        os.path.join(BASE_DIR, 'static2'),
        ]
        INSTALLED_APPS 已注册的APP
        数据库
        中间件注释掉

    'django.middleware.csrf.CsrfViewMiddleware',注释掉可以提交POST请求

     模板TEMPLATES
     	'DIRS': [os.path.join(BASE_DIR, 'templates')]
    
  2. App

    1. 创建app
      命令行
      python manage.py startapp APP名称
      pycharm
      tools ——》 run manage.py task ——》 输入 startapp APP名称
      1. 注册app
        INSTALLED_APPS = [
        ...
        # 'app01',
        'app01.apps.App01Config',

django处理请求的流程:

  1. 浏览器地址栏输入网址,回车发送get请求。
  2. wsgi模块接受消息 。
  3. 获取到url地址,通过对应关系找函数,执行函数。
  4. 函数返回响应,wsgi模块封装响应返回给浏览器。

django使用mysql数据库的流程:

  1. 创建一个mysql数据库;

  2. 在settings中配置数据库:

         DATABASES
     	ENGINE:  django.db.backends.mysql
     	NAME:   数据库的名称
     	HOST:  ip  127.0.0.1 
     	PORT:   3306
     	USER:  'root' 
     	PASSWORD:  '' ’’  
    
  3. 告诉django使用pymysql连接数据库
    在与settings同级目录下的__init__.py中写:

     		import pymysql
     		pymysql.install_as_MySQLdb()
    
  4. 写表 在app下的models.py中写类:

     	from django.db import models
     	class User(models.Model): # app名称_类名小写
     	pid=models.AutoField(Primary_key=True) #主键(可以不写,python自动添加)
                     username = models.CharField(max_length=32)  # varchar(32)
     	password = models.CharField(max_length=32)
    
  5. 执行数据库迁移的命令

     	python manage.py makemigrations  # 记录下models.py的变更记录
     	python manage.py migrate         # 把变更记录同步到数据库中
    

注:在一个类中,含__str__和__repr__时,执行__str__,要是不在一个类中,会调用__repr__方法
6.使用
Urls.py 写函数和URL地址的对应关系

    from django.shortcuts import HttpResponse, render,redirect
    from app01 import views
    from django.conf.urls import url
    urlpatterns = [
	    url(r'^admin/', admin.site.urls),
        url(r'^index/', views.index),
  1. views.py

     写函数
     def index(request):
     	"""业务逻辑"""
     	#return HttpResponse('<h1>indexxxasdlkjqwlkqwe</h1>')
     	return render(request, 'index.html')
    

8.Templates
写模板 {{ 变量 }} {% %}标签

		<thead>
		<tr>
			<th>序号</th>
			<th>ID</th>
			<th>出版社名称</th>
		</tr>
		</thead>
		<tbody>

		{% for i in publishers %} 标签
			<tr>
				<td>{{ forloop.counter }}</td> #序号
				<td>{{ i.pk }}</td>
				<td>{{ i.name }}</td>
			</tr>

		{% endfor %}
		</tbody>

{% if 条件 %}
​ x1
{% elif 条件1 %}
​ x2
{% else %}
​ x3
{% endif %}

外键 : 表示多对一的关系.
1)查询

from app01 import models
models.User.objects.all()   #  获取表中所有的数据  queryset   对象列表 
obj = models.User.objects.get(username='alex') # 获取一个对象 没有或是多个就会报错
obj.username   # 字段值
obj = models.User.objects.filter(username='alex')  
# 获取满足条件的所有对象  queryset  对象列表     没有或是多个不会报错,返回空列表

for book_obj in book_list:
    book_obj.pk  # 主键
    book_obj.name  # 书名
    book_obj.pub   # 书籍关联的出版社对象 
    book_obj.pub_id   # 书籍关联的出版社对象ID 

2)新增

obj = models.Book.objects.get(pk=1)
# 方式一  create()
ret = models.Publisher.objects.create(name=new_name,pub=pub_obj)
re t = models.Publisher.objects.create(name=new_name,pub_id=pub_obj.pk)

# 方式二
ret = models.Publisher(name=new_name)
ret.save()  # 插入到数据中

3)删除

pk = request.GET.get('pk')
# 删除数据
obj = models.Publisher.objects.get(pk=pk)
obj.delete()
  1. 编辑

    obj.name = new_name # 只在内存中修改属性
    obj.save() # 保存到数据库中
    obj.pub = pub_obj # # 书籍关联的出版社对象
    obj.pub_id = pub_obj.pk # # 书籍关联的出版社对象的 id
    obj.save()

多对多 set

1)新增: 提交数据是多个值 getlist

request.POST.getlist('books_id')  ——> [列表]

2)插入数据库

author_obj = models.Author.objects.create(name=name)  # 创建作者对象
author_obj.books.set([books_id, books_id]) #编辑				
# 设置当前作者和书籍的多对多的关系  每次都是重新设置
创建多对多关系的三种方式:

1). django创建第三张表

class Author(models.Model):
    name = models.CharField(max_length=32)
    books = models.ManyToManyField('Book')  # 表示多对多的关系  生成第三张表

2). 自己创建第三张表

class Author(models.Model):
    name = models.CharField(max_length=32)
class Author_Book(models.Model):
    author = models.ForeignKey('Author')
    book = models.ForeignKey('Book')
    time = models.CharField(max_length=32)
  1. django + 自建表
class Author(models.Model):
   name = models.CharField(max_length=32)
   books = models.ManyToManyField('Book',through='Author_Book')  # 表示多对多的关系 
class Author_Book(models.Model):
   author = models.ForeignKey('Author')
   book = models.ForeignKey('Book')
   time = models.CharField(max_length=32)

MVC 和 MTV

  1. MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,
    把软件系统分为三个基本部分:M: 模型(Model)、V: 视图(View)和C: 控制器(Controller),
    特点: 具有耦合性低、重用性高、生命周期成本低等优点。

M 是模型层 主要做业务处理的
V 是视图层 主要做页面的显示效果的
C 是控制层 主要做接受请求和响应的

  1. Django框架的设计模式借鉴了MVC框架的思想,也是分成三部分,来降低各个部分之间的耦合性。
    Django框架的不同之处在于它拆分的三部分为:M: Model(模型)、T: Template(模板)和V: View(视图),也就是MTV框架

Model(模型)::负责业务对象与数据库的对象(ORM)
Template(模版):负责如何把页面展示给用户
View(视图):负责业务逻辑,并在适当的时候调用Model和Template
Django还有一个urls分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template

3. MVC 和MTV的对应关系:
模型(Model) 和 Model(模型)一样, 视图(View) 和 Template(模板html)一样, 展示给用户看的
Controller控制器 = url.py + views.py

模板

1. 继承:
在HTML里
在data_list.html模板里写上

{% block  a%’} {%endblock%}

继承(引用模板):

{% extends  'data_list.html' %}  
{% block  a  %’} 显示的内容{%endblock%}

Block相当于覆盖
注意: 1. {% extends '母版的文件名' %} 写在第一行 前面不要有内容
2. {% extends 'data_list.html' %} 模板的文件名引号要带上 不然当做变量查找
3. 要显示的内容放在block块中,其他部分不显示
4. 模板中定义多个block块 一般写上 css js

2.母版:
一个普通的HTML,提取单多个页面的公共部分,在里面定义block块

{% extends 'layouts.html' %}

{% block  xxx %}

3.组件
一小段HTML代码 nav.html
nav.html是公共模板
使用

{%include  ‘nav.html’%}  #引用公共模板  下面是自己的代码

4. 静态文件相关 (动态的)

​ {% load static %}
​ {% static 'plugins/bootstrap-3.3.7/css/bootstrap.css' %} ——》 完整的静态文件的路径
​ {% get_static_prefix %}plugins/bootstrap-3.3.7/css/bootstrap.css —— 》 静态文件的别名

2.django 变量

{{ 变量 }} 模板里不能有(),[]…等
用点获取对象的相应属性值:
{{list.2}} 索引取值 {{dict.keys}} {{dict.values}}等等

2)注: 当模板系统遇到一个(.)时,会按照如下的顺序去查询:
字典中要是有keys这个键,查到的是他的值,要是没有,查到的是所有的键
类中的属性和方法同理

3.Filters过滤器

语法

{{ value|filter_name }}或者 {{ value|filter_name:参数 }}

  1. default

    {{ aa|default:"nothing"}} # 设置默认值
    变量不存在或者值为空,页面会显示default的默认值 注:分号两边不能有空格
    或者 在setting里面设置默认值,default的值就不起作用了
    TEMPLATES的OPTIONS可以增加一个选项:string_if_invalid:'找不到',可以替代default的的作用。

  2. filesizeformat

    {‘f’:1*1024} {{ f|filesizeformat }} 结果是1MB 最大是PB

  3. add :

    {{ value|add:"2" }} -2是减法
    乘法 :

    {% widthratio 10 2 10 %} 等同于(10/2)*10
    数字加减, 字符串的拼接 , 列表的拼接

  4. lower:小写
    upper:大写
    title:首字母大写

    {{ value|lower }}

  5. length:长度

  6. slice:切片

    {{s|slice:’0:2’}}

  7. first:取元素第一个值
    last:最后一个值

    {{ value|last }}

  8. truncatechars:截断

    {{ value|truncatechars:9}} 按照字符串截断
    truncateword:9 按照单词截断

  9. date日期格式化

    {{ value|date:"Y-m-d H:i:s"}
    或者 在# settings 中配置

    USE_L10N = False
    DATETIME_FORMAT = 'Y-m-d H:i:s'
    DATE_FORMAT= 'Y-m-d’
    TIME_FORMAT =’ H:i:s’

  10. **safe **:安全过滤器
    “|safe”的方式告诉Django这段代码是安全的不必转义。

aa = "<a href='#'>点我</a>"    {{ aa|safe}}就是超连接的点我

4.自定义filter

步骤
1.在app下创建一个名为templatetags的Python包 # templatetags不能变
2.在包内创建py文件 —— my_tags.py
3.在py文件中下:

from django import template
register = template.Library()     #  register 不能变

4.写函数+装饰器

@register.filter
def add_str(value, arg=None):   # 函数名 就是 过滤器的名字  value变量  arg 给变量添加额外的参数
ret = '{}__{} '.format(value, arg)
print(ret)
return ret

5.使用:在hml里写

{% load my_tags %}  #  导入文件 固定格式 my_tags是py文件名
{{ 'alex'|add_str:'sb' }}

simple_tag

simple_tag 和filter相似,filter只能传一个参数, .simple_tag可以传多个
在py 文件下

@register.simple_tag
def sqr_list(*args,**kwargs):
    return '_'.join(args)+ '+**'.join(kwargs.values())

在html下

{% load py文件名 %}
{% sqr_list 'a' 'c' aa='12' %}

inclusion_tag 返回的是字典,还需要些模板

Pagenation.py

@register.inclusion_tag(‘pagenation.html’)
Def pagenation(num,now):
Return {‘num’:range(1,num+1),’now’:now}

模板pagenation.html:

{%for I in  num%}
{{ i}}
{%endfor%}

在index.html

{% load  py文件名%}
{% pagenation 3%}}

具体步骤如下:

  • 第一步:在app下创建一个名为templatetags(必须是这个名字)文件夹
  • 第二步:在这个文件夹下创建一个py文件,名字没要求。
  • 第三步:在py文件中先导入,在注册,代码是固定死的。
  • 第四步:写视图函数得到页面所需要的数据,将数据return回来。
  • 第五步:给这个视图函数加上@register.inclusion_tag(filename='left_menu.html'),以指定html文件将数据传入。
for循环


{% for i in keys %}
<li> {{ forloop}} </li>
{% endfor %}

结果

2) {%empty%} for循环语句里没有内容就显示empty
例:

 <ul>
{% for user in user_list %}
    <li>{{ user.name }}</li>
{% empty %}
    <li>空空如也</li>
{% endfor %}
</ul>

3) If语句 if,elif和else
if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。
不支持 算数运算 add
不支持连续判断 10 > 5 > 1 false

4)with 语句 起别名

{% with dic.name as a %}
    {{ a }}
{% endwith %}

**csrf **: 跨站请求伪造
在form表单里使用,写上{% csrf_token %},提交就不会报错
生成一个隐藏的input标签 name 等于csrfmiddlewaretoken

原文地址:https://www.cnblogs.com/xm-179987734/p/12326302.html