django第三天

动态路由,实现统一删除功能

urls

url(r'^host_del/(host|user|group)/(\d+)$',views.host_del,name='del'),

template

<a href="{% url 'app01:del' 'host' obj.id %}" class="btn btn-sm btn-danger">删除</a>

views

from app01.models import *
import sys
def host_del(request,*args):
table = getattr(sys.modules[__name__],args[0].capitalize())
host = table.objects.filter(id=args[1])
host.first().user.clear()
host.delete()
return redirect(to='/host_list/')

外键的增改查

class Book(models.Model):
title = models.CharField(max_length=32)
publisher = models.ForeignKey('Publisher',related_name='books') book_obj.publisher ——》 关联的对象 book_obj.publisher_id
book_obj.publisher.id
book_obj.publisher.name 不指定related_name
pub_obj.book_set ——》管理对象
pub_obj.book_set.all() 指定related_name='books'
pub_obj.books ——》管理对象
pub_obj.books.all() Book.objects.filter(publisher__name='') 不指定related_name
Publisher.objects.filter(book__title='')
指定related_name='books'
Publisher.objects.filter(books__title='') 指定related_name='books',related_query_name='xxx'
publisher = models.ForeignKey('Publisher',related_name='books',related_query_name='xxx') Publisher.objects.filter(xxx__title='')

多对多的操作

正向查询

author字段里有books字段:
books = models.ManyToManyField(to='Book') # Django自动生成第三张表 author_obj = models.Author.objects.filter(id__lt=3).first() author_obj.books ——》 管理对象 author_obj.books.all() ——》 所有关联的对象
author_obj.books.set([1,2]) ——》 设置多对多关系
author_obj.books.set([对象1,对象2]) ——》 设置多对多关系 author_obj.books.remove(对象1 或者 id ) ——》 删除某一个多对多关系
author_obj.books.clear() ——》 删除所有多对多关系
author_obj.books.add(对象1 或者 id ) ——》 删除某一个多对多关系 author_obj.books.create() ——》 创建一个新的书籍对象 并且和当前的作者对象做关联

反向查询

跟外键一样。

聚合和分组

聚合

from django.db.models import Sum,Max,Min,Avg,Count

models.Book.objects.aggregate(Sum('price'),Count('price'),max=Max('price'))

分组
models.Book.objects.annotate(Count('author')).values() ——》 对象列表 把聚合结果放到对象中 models.Book.objects.values('publisher__name').annotate(min=Min('price')).values('publisher__name', 'min') ——》最后的values的内容只能是前面提到的

F和Q

from django.db.models import F	

F 动态取某个字段的值
ret = models.Book.objects.filter(kucun__lt=F('sale')).values()
models.Book.objects.update(sale=F('sale')*2)
Q 条件
Q(条件) Q(条件) | Q(条件) 或的关系 or
Q(条件) & Q(条件) 与的关系 and
~Q(条件) 非的关系 not

事务

import os

if __name__ == '__main__':
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "BMS.settings")
import django
django.setup() import datetime
from app01 import models try:
from django.db import transaction
with transaction.atomic():
new_publisher = models.Publisher.objects.create(name="火星出版社")
models.Book.objects.create(title="橘子物语", publish_date=datetime.date.today(), publisher_id=10) # 指定一个不存在的出版社id
except Exception as e:
print(str(e))

模板之自定义filter、simple_tag、inclusion_tag

  1. 自定义filter

     	1. 在app下创建一个名为templatetags的python包
    2. 在templatetags下创建python文件 名字可随意 my_tags
    3. 导入并实例化
    from django import template
    register = template.Library() # register名字不能改 4. 定义函数
    @register.filter(name='dsb')
    def add_dsb(value,arg): # value 变量 arg 冒号后面的参数
    ret = "{}_{}".format(value,arg)
    return ret 5. 使用:
    在模板中使用
    {% load my_tags %}
    {{ "alex"|dsb:'very_dsb' }} 指定name 用name 没有指定name 用函数名
  2. 自定义simple_tag

     	同自定义filter的1、2、3
    4.定义函数 @register.simple_tag()
    def string_join(*args,**kwargs):
    ret = '_'.join(args) + '*'.join(kwargs.values())
    return ret
    5. 使用
    在模板中使用
    {% load my_tags %}
    {% string_join 'suibian' 'zhensuibian' k1='taisuibian' k2='jiushisuibian' %}
  3. 自定义inclusion_tag

     	同自定义filter的1、2、3
    4.定义函数
    @register.inclusion_tag('pagination.html')
    def pagination(total,page):
    return {'total':range(1,total+1),'page':page} 5. 有模板文件
    在模板中根据传过来的参数做渲染 ——》 完整的HTML代码段 6. 使用
    在模板中使用
    {% load my_tags %}
    {% pagination 10 5%}

cookie

Cookie的由来

大家都知道HTTP协议是无状态的。

无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直
接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的请求响应情况。 一句有意思的话来描述就是人生只如初见,对服务器来说,每次的请求都是全新的。 状态可以理解为客户端和服务器在某次会话中产生的数据,那无状态的就以为这些数据不会被
保留。会话中产生的数据又是我们需要保存的,也就是说要“保持状态”。因此Cookie就是在这样
一个场景下诞生。

什么是Cookie

Cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访
问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息。

Cookie的原理

cookie的工作原理是:由服务器产生内容,浏览器收到响应后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断这个是“谁”了。

Django中操作Cookie

获取Cookie

request.COOKIES['key']

设置Cookie

rep = HttpResponse(...)
rep = render(request, ...) rep.set_cookie(key,value,...)

参数

    1. key, 键
    1. value='', 值
    1. max_age=None, 超时时间
    1. expires=None, 超时时间(IE requires expires, so set it if hasn't been already.)
    1. path='/', Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
    1. domain=None, Cookie生效的域名
    1. secure=False, https传输
    1. httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)

删除Cookie

def logout(request):
rep = redirect("/login/")
rep.delete_cookie("user") # 删除用户浏览器上之前设置的user的cookie值
return rep

session

http不知道每次请求是谁访问,因为这样快,简单快速,

   session写操作
request.session["user"]=user
'''
1、生成随机字符串
2、写cookie {"sessionID":"234asd243dv35fd"}
3、django-session表:
session-key session-data
234asd243dv35fd {"user":"alex"}
''' session读操作
user=request.session.get("user") '''
1 {"sessionID":"234asd243dv35fd"} # 先把这个值取出来
2 django-session表:
session-key session-data
234asd243dv35fd {"user":"alex"}
3 {"user":"alex"}.get("user")
''' request.session到底是什么? 注销:
request.session.flush() 删除表中的记录

day20_雷神_django第三天的更多相关文章

  1. day21_雷神_django第四天

    django第四天 1.form组件 解决两个事情: 不想重复提交,数据重置: 校验规则 流程: (1) 创建form组件对应的类,比如LoginForm (2) views.login: if ge ...

  2. day19_雷神_django第二天

    django_day02 Django的路由系统 URL配置(URLconf)就像Django所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表. 1.URLconf配置 基本 ...

  3. day24_雷神_django项目部署

    # django项目部署 ... curl -I www.baidu.com 得到响应头信息 vim 里shift + % 找括号的另一半 find / -name virtualenv 3.创建虚拟 ...

  4. day18_雷神_django第一天

    # django_day01 1.http 协议 超文本传输协议,HTTP有很多应用,但最著名的是用于web浏览器和web服务器之间的双工通信. 协议概述 HTTP是一个客户端终端(用户)和服务器端( ...

  5. 从0开始学习react(三)

    这次我们来讲解第三节知识,考虑了下,先不去讲什么理论了,毕竟网上一搜一大堆,而且理论真心看不太懂啊!!! 今天我们就直接上实例喽! 大家HIGH起来!!!(想了好久,还是没舍得删这句话) 1.根据下图 ...

  6. 【雷神源码解析】无基础看懂AAC码流解析,看不懂你打我

    一 前言 最近在尝试学习一些视频相关的知识,随便一搜才知道原来国内有雷神这么一个真正神级的人物存在,尤其是在这里(传送门)看到他的感言更是对他膜拜不已,雷神这种无私奉献的精神应当被我辈发扬光大.那写这 ...

  7. HTML5物理游戏开发 - 越野山地自行车(三)粉碎自行车

    自上一章公布到如今已时隔四月,实在对不住大家.让大家久等了~话说不是我不关注我的博客,而是事情一多起来写博客的时间就少了. 待到今日有空了,回头看了看自己曾经写的文章,猛得发现已经四个月不曾写文章了. ...

  8. 问题 A: 雷神领域

    传送门 题目描述 L君,S大陆首屈一指的天才魔法师,创造了一个新魔法:雷神领域.  这个魔法会首先在地面上形成正方网格魔法阵列,然后在某些位置召唤雷电轴标.注意:一个位置只能有一个雷电轴标存在. 雷电 ...

  9. Bert系列(三)——源码解读之Pre-train

    https://www.jianshu.com/p/22e462f01d8c pre-train是迁移学习的基础,虽然Google已经发布了各种预训练好的模型,而且因为资源消耗巨大,自己再预训练也不现 ...

随机推荐

  1. ELK收集日志到mysql

    场景需求 在使用ELK对日志进行收集的时候,如果需要对数据进行存档,可以考虑使用数据库的方式.为了便于查询,可以同时写一份数据到Elasticsearch 中. 环境准备 CentOS7系统: 192 ...

  2. 微信小程序——编辑

    记录一下 微信小程序分页编辑,可增页删除当前页面.第一页为主图片和主句子.其他页面一致. 左滑右滑可切换页面.每页可增加0到1页.小黑点与页面一致. /* pages/booktool/write/w ...

  3. BigDecimal 类型转换、运算、比较

    序:Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算.双精度浮点型变量double可以处理16位有效数.在实际应用中,需要对更大或者更小的数 ...

  4. 如何用命令将本地项目上传到git[z]

    1.(先进入项目文件夹)通过命令 git init 把这个目录变成git可以管理的仓库 git init 2.把文件添加到版本库中,使用命令 git add .添加到暂存区里面去,不要忘记后面的小数点 ...

  5. python websocket 再线聊天室的 Demo

    服务端 import tornado.web import tornado.ioloop import tornado.httpserver import tornado.options import ...

  6. vba判断文件是否存在的两种方法(转)

    方法1. 用VBA自带的dir()判断,代码如下: 在 Microsoft Windows 中, Dir 支持多字符 (*)和单字符 (?) 的通配符来指定多重文件 Function IsFileEx ...

  7. 有关ajax的理解;

    jQuery是JavaScript封装的一个库,里面封装了一些便于我们使用的方法,同时还有$.ajax()的一些理解需要我们更加深入了解 ajax简介: 实现后台与前台交互的功能或方法就叫做ajax: ...

  8. Tableau可视化绘图教程

    https://www.w3cschool.cn/tableau/tableau_environment_setup.html

  9. skynet记录7:第一个服务logger和第二个服务bootstrap

    (1)logger是skynet_context_new创建:skynet_context及mq,模块create和init (2)bootstrap启动过程:snlua时一个lua的so,对应的sn ...

  10. Ax用Excel导出表的字段属性信息

    static void CKT_ExportTableColnum(Args _args){ LJD_QaHalf_Figure _LJD_QaHalf_Figure; SysDictTable sd ...