Django笔记

Django笔记1 创建指令创建项目 django admin startproject MyDjango manage py 命令行工具 init py 初始化文件 settings py 项目的配置文件 urls py 项目的 URL 设置 网站的地址信息 wsgi py 是 python 应用与 web 服务器之间的接口

大家好,我是讯享网,很高兴认识大家。

1、创建指令创建项目 django-admin startproject MyDjango

manage.py命令行工具 __init__.py初始化文件 settings.py项目的配置文件 urls.py项目的URL设置,网站的地址信息 wsgi.py是python应用与web服务器之间的接口,用于Django项目在服务器上的部署和上线,一般不需要修改 

讯享网

2、创建项目应用,相当于网站的功能,每个APP代表网站的一个或多个网页,使用python manage.py startapp xxx创建

讯享网migrations用于数据库数据的迁移 __init__.py初始化文件 admin.py当前APP的后台管理系统 apps.py当前APP的配置信息 models.py定义映射类关联数据库,实现数据持久化 tests.py自动化测试的模块 views.py逻辑处理模块 

3、指令启动python manage.py runserver 8080设置端口为8080

4、模板路径的配置

在settings.py文件中, TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR,'templates')], 'APP_DIRS': True, 

5、静态路径的配置

讯享网STATIC_URL = '/static/' STATICFILES_DIRS=[os.path.join(BASE_DIR,'public_static'), os.path.join(BASE_DIR,'index/index_static'),] 

6、url对应关系

/login/      login
def login(request):
    request.method
    request.POST  ->请求体
    request.GET   ->请求头中的URL
    request.POST.getlist
    
    return HttpResponse() -->返回字符串
    return render(request,'login.html',{...}) -->函数里的参数值,模板,渲染
    return redirect('要跳转的网址')
GET请求->只有request.GET中有值
POST请求->GET和POST都可以获得值

7、模板引擎中的特殊标记

讯享网for,if,列表索引.
login.html
  {
  
  
  
  
  
  
  
    
  {name}}
def login(request):
    return render(request,'login.html',{'name':'alex'})

8、练习

学员管理:

表:

​ 班级 学生 老师

单表操作:

​ 增删改查

多对多操作

​ 增,删,改,查,

  • js阻止默认事件的发生
  • location.reload()重新加载
  • HttpReponse(json.dumps())将json格式转化为字符串
  • JSON.parse()将字符串转化为json
  • $(‘#addModal’).clicak(function(){

    ​ return flase;

    })

    jQuery事件阻止默认事件发生
  • 模板渲染是在后台执行
  • $.ajax({ url:'', type:'', data:{}, datatype:'JSON',#把arg转化为json对象 success:function(arg){} }) 

9.Http请求生命周期

请求头到达后台,后台提取url进行路由匹配,然后找到相应的函数(模板+数据渲染),最后再返回给用户(响应头+响应体)

10.Bootstrap

一个包含CSS和JS的一个代码库

(1)样式

(2)响应式@media关键字

导航条

栅格

(3)当鼠标移动到XX样式的标签上时,其子标签.g应用到以下属性

.xx:hover .g{}

11.Django模板

1.页面继承

讯享网	母版:存放所有页面公用
		<html>
		    {% block css %} {%endblock%}
			...
			{% block s1 %} {%endblock%}
			...
			{% block js %} {%endblock%}
		
		</html>
	子板:继承母版,自定义当前页面私有的东西
		{% extends "layout.html "%}
		
		{% block s1 %} <h1>fff</h1> {%endblock%}
		{% block s2 %} <h1>ffffff</h1> {%endblock%}

2、函数-》自动执行

'userinfo':{'k1':'v1','k2':'v2'} 打印字典所有的key {% for k,v in userinfo.items %} { 
  
    
  {k}}-{ 
  
    
  {v}} {% endfor %}} 

3、自定义函数

a.在app中创建templatetags模块

b.创建任意.py文件,例如,xx.py

讯享网#此处放置自定义的函数 from django import template register=template.Library() #自定义一个函数 @register.filter def my_upper(value): return value.upper() def my_bool(value): return False @register.simple_tag def my_lower(value): return value.lower() 

c.在使用自定义simple_tag的html文件中导入之前创建的.py文件名

#在使用simple_tag的HTML文件的最上面导入 {% load xx %} 

d.使用smple_tag

讯享网#filter #-最多两个参数,方式: { 
  
    
  {第一个参数|函数名称:"第二个参数"}} { 
  
    
  {name|my_upper}} #tag #无限制参数: {% 函数名 参数 参数%} {% my_lower "ALEX" %} #filter可以做条件判断 {% if name|my_bool %} <h3>真</h3> {%else%} <h3>假</h3> {% endif %} 

e.在settings中配置当前app.不然django无法找到自定义的simple_tag

4、include导入

(可以导入多个,母版只能继承一次)

导入小组件
pub.html
					<div>
						<h3>特别漂亮的组件</h3>
						<div class="title">标题:{
  
  
  
  
  
  
  
    
  { name }}</div> <div class="content">内容:{ 
  
    
  { name }}</div>
					</div>
test.html
					<!DOCTYPE html>
					<html lang="en">
					<head>
						<meta charset="UTF-8">
						<title></title>
					</head>
					<body>
						{% include 'pub.html' %}
						{% include 'pub.html' %}
						{% include 'pub.html' %}
					</body>
					</html>

12.用户登录

讯享网 -cookie: a.保存在浏览器端“键值对”,设置超时时间 b.服务端可以向用户浏览器端写cookie c.客户端每次请求时,会携带cookie去 - 发送Http请求时,在请求头中携带当前所有可访问的cookie - 响应头 - 写cookie @xzxx def index(request): obj = HttpResponse('...') obj.set_cookie(.....) request.COOKIES.get(...) obj.set_signed_cookie(.....) request.get_signed_cookie(....) set_cookie set_cookie key, value='', max_age=None, expires=None, path='/', domain=None, secure=False, Https httponly=False 只能自Http请求中传入,js代码无法获取到 cookie签名: obj.set_signed_cookie('ticket',"",salt='jjjjjj') #去请求的cookie中找凭证 request.get_signed_cookie('ticket',salt='jjjjjj') - 自定义cookie签名 - 装饰器装饰views中的函数 

13.Django目录介绍

 django-admin startproject mysite cd mysite python manage.py starapp app01 project - app01 - admin Django自带后台管理相关配置 - modal 写类,根据类创建数据库表 - test 单元测试 - views 业务处理 - app02 - app03 

14.路由

讯享网http://127.0.0.1:8080/edit/?nid=fff
url(r'^edit/',views.edit),
def edit(request):
    request.GET.get('nid')
    return HttpResponse('...')
    
http://127.0.0.1:8080/edit/fff
url(r'^edit/(\w+)/',views.edit),
def edit(request,a1):
    return HttpResponse('...')

http://127.0.0.1:8080/edit/fff/sds
url(r'^edit/(\w+)/(\w+)/',views.edit)
def edit(request,a1,a2):
    return HttpResponse('...')
    
url(r'^edit/(?P<a1>\w+)/(?P<a2>\w+)/',views.edit)
def edit(request,a1,a2):
    return HttpResponse('...')
终止符  
http://127.0.0.1:8080/edit/
url(r'^edit/',views.edit),  
http://127.0.0.1:8080/edit(这样的方式后面有没有/)
url(r'^edit$',views.edit),
伪静态
url(r'^edit/(\w+).html$',views.edit),
路由别名反向生成url
url(r'^index/',views.index,name='n1'),    
name根据名字反生成url
def index(request):
    v=reverse('n1')
    print(v)#/index/
url(r'^index/(\d+)/',views.index,name='n1'),     
def index(request):
    v=reverse('n1',args=(1,))
    print(v)#/index/1/  
url(r'^index/(?P<a1>\d+)/',views.index,name='n1'),  
from django.urls import reverse
v = reverse('n1',kwargs={'a1':1111})
print(v)    

url(r'^login/', views.login,name='m1')
<form method="POST" action='{% url "m1" %}'>
url(r'edit/(\w+)/',views.edit,name='n2')
<li>{
  
  
  
  
  
  
  
    
  {i}}|<a href="{% url "n2" i %}">编辑</a></li>

权限管理
url(r'^index/asdf/asfds',views.index,name='n1')
url(r'^index/asefdf/efasfds',views.index,name='n2')
url(r'^index/asefdf/asfdewfs',views.index,name='n3')
小明 n1 n2 n3
小花 n2 n3 
def index(request):
    url_list=['n1','n2','n3']
    return render(...,url_list)
html:
    <ul>
    for v in url_list:
        <li><a href='{% url v %}'>ff</a></li>
    </ul>
或者
def index(request):
    url_list=['n1','n2','n3']
    temp=[]
    for i in url_list:
         url=reverse(i)
         temp.append(url)
    return render(...,temp)
html:
    <ul>
    for url in temp:
        <li><a href='{
  
  
  
  
  
  
  
    
  {url}}'>ff</a></li> </ul> 
url -> 函数
a. /login/ -> def login
b. /add-user/(\d+)/  ->  def add_user(request,a1)	
c. /add-user/(?P<a1>\d+)/  ->  def add_user(request,a1)
    PS: 
        终止符:
        ^edit$
        伪静态
        url(r'^edit/(\w+).html$', views.edit),
d. 路由分发
    urls.py
    url(r'^app01/', include('app01.urls')),
    url(r'^app02/',include('app02.urls')),
    
    app01.urls.py
    url(r'^index.html$', views.index),
    
    如果用户所输入的地址不存在,可以设置一个默认的跳转页面
    def  default(request):
         return HttpResponse('错误')
    url(r'^',default),  
e. /add-user/(\d+)/  ->  def add_user(request,a1)  name=n1
			根据名称可以反向生成URL
			1. 在Python代码中
				from django.urls import reverse
				v = reverse('n1',kwargs={'a1':1111})
				print(v)
			2. 
				url(r'^login/', views.login,name='m1')
				{% url "m1" %}    
    

15.ORM操作表

讯享网ORM利用pymysql第三方工具连接数据库 默认: SQLlite MySQL: mysql -> MySQLDB(修改django默认连接mySQL方式) Http请求: url -> 视图(模板+数据) 步骤: 1. 创建数据库 2. settings DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME':'s4day70db', 'USER': 'root', 'PASSWORD': '', 'HOST': 'localhost', 'PORT': 3306, } } 3. __init__.py import pymysql pymysql.install_as_MySQLdb() 4. models.py from django.db import models class UserInfo(models.Model): nid=models.BigAutoField(primary_key=True) username=models.CharField(max_length=32) password=models.CharField(max_length=64) 5.settings.py注册APP 在installed_apps中加入app的名字 6.创建数据表 命令: python manage.py makemigrations python manage.py migrate 7. 创建表 from django.db import models from django.db import models class UserGroup(models.Model): """ 部门 """ title = models.CharField(max_length=32) """ 增 models.UserGroup.objects.create(title='销售部') 删 models.UserGroup.objects.filter(id=2).delete() 改 models.UserGroup.objects.filter(id=2).update(title='公关部') 查 group_list = models.UserGroup.objects.all() group_list = models.UserGroup.objects.filter(id=1) group_list = models.UserGroup.objects.filter(id__gt=1) group_list = models.UserGroup.objects.filter(id__lt=1) """ # Create your models here. class UserInfo(models.Model): """ 员工 """ nid = models.BigAutoField(primary_key=True) username = models.CharField(max_length=32) password = models.CharField(max_length=64) #age=models.IntegerField(null=True) age = models.IntegerField(default=1) ug = models.ForeignKey("UserGroup", null=True,on_delete=models.DO_NOTHING) 
#models.py from django.db import models class UserType(models.Model): '''用户类型''' title=models.charField(max_length=32) class UserInfo(models.Model): '''用户表''' name=models.charField(max_length=16) age=models.IntegerField() ut=models.ForeignKey('UserType') 
讯享网#views.py from django.shortcuts import render,HttpResponse from app01 import models from django.core.paginator import Paginator,Page,PageNotAnInteger,EmptyPage def test(request): # 创建数据 # models.UserType.objects.create(title='普通用户') # models.UserType.objects.create(title='二逼用户') # models.UserType.objects.create(title='牛逼用户') # models.UserInfo.objects.create(name='方少伟',age=18,ut_id=1) # models.UserInfo.objects.create(name='由秦兵',age=18,ut_id=2) # models.UserInfo.objects.create(name='刘庚',age=18,ut_id=2) # models.UserInfo.objects.create(name='陈涛',age=18,ut_id=3) # models.UserInfo.objects.create(name='王者',age=18,ut_id=3) # models.UserInfo.objects.create(name='杨涵',age=18,ut_id=1) # 获取 # QuerySet[obj,obj,obj # result = models.UserInfo.objects.all() # for obj in result: # print(obj.name,obj.age,obj.ut_id,obj.ut.title) # UserInfo,ut是FK字段 - 正向操作 PS: 一个用户只有一个用户类型 # obj = models.UserInfo.objects.all().first() # print(obj.name,obj.age,obj.ut.title) # UserType, 表名小写_set.all() - 反向操作 PS: 一个用户类型下可以有很多用户 # obj = models.UserType.objects.all().first() # print('用户类型',obj.id,obj.title) # for row in obj.userinfo_set.all(): # print(row.name,row.age) 
1、增删改查
2、一般:
models.UserInfo.objects.filter(id_gt=1) models.UserInfo.objects.exclude(id=1) 
3、排序
讯享网user_list=models.UserInfo.objects.all().order_by('-id','name') 
4、分组
from django.db.models import Count,Sum,Max,Min v=models.UserInfo.objects.values('ut_id').annotate(xxxx=Count('id')) print(v.query) v=models.UserInfo.objects.values('ut_id').annotate(xxxx=Count('id')).filter(xxxx__gt=2) v=models.UserInfo.objects.filter(id__gt=2).values('ut_id').annotate(xxxx=Count('id')).filter(xxxx__gt=2) print(v.query) 
5、F,更新时用于获取原来的值
讯享网from django.db.models import F,Q models.UserInfo.objects.all().update(age=F('age')+1) 
6、Q,用于构造复杂查询条件
q1=Q() q1.connector='OR' q1.children.append(('id_gt',1)) q1.children.append(('id', 10)) q2=Q() q2.connector='OR' q2.children.append(('c1',1)) q2.children.append(('c2',2)) q3=Q() q3.connector='AND' q3.children.append(('id',1)) q3.children.append(('id',2)) q2.add(q3,'OR') con=Q() con.add(q1,'AND') con.add(q2,'AND') models.UserInfo.objects.filter(con) 
7、extra额外查询条件以及相关表排序

models.UserInfo.objects.extra(self, select=None, where=None, params=None, tables=None, order_by=None, select_params=None)

select …from 表

select

select_params=None

select * from 表 where…

where

params=None

select * from 表,…

tables

select * from 表 order by…

order_by=None

讯享网models.UserInfo.objects.extra( select={'newid':'select count(1) from app01_usertype where id>%s'}, select_params=[1,], where=['age>%s'], params=[18,], order_by=['-age'], tables=['app01_usertype'] ) """ select app01_userinfo.id, (select count(1) from app01_usertype where id>1) as newid from app01_userinfo,app01_usertype where app01_userinfo.age > 18 order by app01_userinfo.age desc """ 
v=models.UserInfo.objects.all().extra( select={ 
    'n':'select count(1) from app01_usertype where id=%s or id=%s', 'm':'select count(1) from app01_usertype where id=%s or id=%s', }, select_params=[1,2,3,4] ) #where中元素是通过列表连接的 models.UserInfo.objects.extra( where=['id=1 or id=%s','name=%s'], params=[1,"alex"] ) models.UserInfo.objects.extra( tables=['app01_usertype'], where=['app01_usertype.id=app01_userinfo.ut_id'] ) """select * from app01_userinfo,app01_usertype""" """select * from app01_userinfo,app01_usertype where app01_usertype.id=app01_userinfo.ut_id""" 
8、原生SQL语句
讯享网from django.db import connection,connections cursor=connection.cursor()#默认连接default数据库 #default为默认的连接数据库的名字 cursor=connections['default'].cursor() #也可以连接其他的数据库 cursor=connections['db2'].cursor() cursor.execute("""SELECT * from auth_user where id = %s""", [1]) row = cursor.fetchone() row = cursor.fetchall() 
9、简单的操作

http://www.cnblogs.com/wupeiqi/articles/6216618.html

10、用字典的方式

1.增

create(name=‘xx’,age=‘xx’…)

dic={name’'xxx,age}

create(dic)

2.更新

models.xx.objects.filter(id=1).update(a=1,b=2)

models.xx.objects.filter(id=1).update(dic)

3、查询


讯享网

models.xx.objects.filter(id=1,xxx)

models.xx.objects.filter({‘id’:1,‘name’:‘alex’})

Django帮助数据转换->字典 =》Form组件(用户请求规则验证+数据字典)

11、连表补充

select_related:查询主动做连表(但是相对于prefetch_related慢)

q=models.UserInfo.objects.all() #select * from userinfo for row in q: print(row.name,row.ut.title) #这种查询表多次,较满 q=models.UserInfo.objects.all().select_related('ut','gp') #select * from userinfo inner join usertype on ... for row in q: print(row.name,row.ut.title) 

prefetch_related:不做连表,做多次查询

讯享网q=models.UserInfo.objects.all().prefetch_related('ut') #select * from userinfo; #select * from usertype where id in [2,4] for row in q: print(row.id,row.ut.title) 
12、多对多

1.manyToManyField自动创建

2.自定义关系表

3.两者结合

models.py

class Boy(models.Model): name=models.CharField(max_length=32) class Girl(models.Model): nick=models.CharFiled(max_length=32) class Love(models.Model): b=models.ForeignKey('Boy') g=models.ForeignKey('Girl') #联合唯一索引 class Meta: unique_together=[ ('b','g'), ] 
讯享网#创建表 python manage.py makemigrations python manage.py migrate 

views.py

#多对多 objs=[ models.Boy(name='aa'), models.Boy(name='bb'), models.Boy(name='cc'), models.Boy(name='dd'), models.Boy(name='ee'), ] models.Boy.objects.bulk_create(objs,5) objss=[ models.Girl(nick='小花'), models.Girl(nick='小斯'), models.Girl(nick='小萌'), models.Girl(nick='小心'), models.Girl(nick='小小'), ] models.Girl.objects.bulk_create(objss,5) models.Love.objects.create(b_id=1,g_id=1) models.Love.objects.create(b_id=1,g_id=4) models.Love.objects.create(b_id=2,g_id=4) models.Love.objects.create(b_id=2,g_id=2) #1.和aa有关系的女生 #方法一 obj=models.Boy.objects.filter(name='aa').first() love_list=obj.love_set.all() for row in love_list: print(row.g.nick) #方法二 love_list=models.Love.objects.filter(b__name='aa') for row in live_list: print(row.g.nick) #方法三 love_list=models.Love.objects.filter(b__name='aa').values('g__nick') for item in love_list: print(item['g__nick']) love_list=models.Love.objects.filter(b__name='aa').select_rated('g') for obj in love_list: print(obj.g.nick) # 

Django也提供自动创建第三张表,但是无法直接对第三张表操作,但是可以间接操作,且只能生成三列

讯享网class Boy(models.Model): name=models.CharField(max_length=32) m=models.ManyToManyField('Girl') class Girl(models.Model): nick=models.CharFiled(max_length=32) #创建表 python manage.py makemigrations python manage.py migrate 
obj=models.Boy.objects.filter(name='aa').first() print(obj.id,obj.name) #增 #obj.m.add(3) #obj.m.add(2,4) #obj.m.add(*[1,]) #删 obj.m.remove(1) obj.m.remove(2,3) #改 obj.m.set([1,]) #获取 q=obj.m.all()#得到[女生对象] #获取aa联系的女生 obj=models.Boy.objects.filter(name='aa').first() #girl_list=obj.m.all() girl_list=obj.m.filter(nick='小小') obj=models.Boy.objects.filter(name='aa').first() obj.m.clear() obj=models.Girl.objects.filter(nick='小小').first() v=obj.boy_set.all() 

#m=models.ManyToManyField(‘Girl’,through=“Love”,through_felds=(‘b’,‘g’,))

同时自动创建和用自己定义的表;查询和清空的功能

16.CBV&&FBV

讯享网FBV:就是在视图里使用函数处理请求
CBV:就是在视图里使用类处理请求(使用class-based views)
from django.http import HttpResponse
from django.views import View
class MyView(View):
      def get(self,request):
      return HttpResponse('ok')
class-based view提供了一个as_view()静态方法,调用这个方法,会创建一个类的实例,然后通过实例调用dispatch()方法,dispatch()会根据request的method的不同调用相应的方法来处理request      
#urls.py
from app01 import views
urlpatterns=[
url(r'^login.html$', views.Login.as_view()),
]

17.分页

1.分批获取数据
models.UserInfo.objects.all()[0:10]
models.UserInfo.objects.all()[10:20]
2.Django自带
from django.core.paginator import Paginator,Page,PageNotAnInteger,EmptyPage
def index(request):
    current_page=request.GET.get('page')
    user_list=models.UserInfo.objects.all()
    paginator=Paginator(user_list,10)
    # per_page: 每页显示条目数量
    # count:    数据总个数
    # num_pages:总页数
    # page_range:总页数的索引范围,如: (1,10),(1,200)
    # page:     page对象
    try:
        posts=paginator.page(current_page)
    except PageNotAnInteger as e:
        posts=paginator.page(1)
    except EmptyPage as e:
        posts=paginator.page(1)
    return render(request,'index.html',{'posts':posts}) 
    # has_next              是否有下一页
    # next_page_number      下一页页码
    # has_previous          是否有上一页
    # previous_page_number  上一页页码
    # object_list           分页之后的数据列表
    # number                当前页
    # paginator             paginator对象
<h1>用户列表</h1>
<ul>
    {%for row in posts.object_list %}
          <li>{
  
  
  
  
  
  
  
    
  {row.name}}</li>
    {% endfor %}
</ul>
<div>
    {% if posts.has_previous %}
        <a href="/index.html?page={
  
  
  
  
  
  
  
    
  {posts.previous_page_number}}">上一页</a>
    {% endif %}
    {% if posts.has_next %}
		<a href="/index.html?page={
  
  
  
  
  
  
  
    
  { posts.next_page_number }}">下一页</a>
	{% endif %}
</div>
3.自定义分页组件
from utils.pager import PageInfo
def custom(request):
    # 表示用户当前想要访问的页码: 8

    all_count = models.UserInfo.objects.all().count()

    page_info = PageInfo(request.GET.get('page'),all_count,10,'/custom.html',11)
    user_list = models.UserInfo.objects.all()[page_info.start():page_info.end()]

    return render(request,'custom.html',{'user_list':user_list,'page_info':page_info})

#paper.py
class PageInfo(object):

    def __init__(self,current_page,all_count,per_page,base_url,show_page=11):
        """

        :param current_page:
        :param all_count: 数据库总行数
        :param per_page: 每页显示函数
        :return:
        """
        try:
            self.current_page = int(current_page)
        except Exception as e:
            self.current_page = 1
        self.per_page = per_page

        a,b = divmod(all_count,per_page)
        if b:
            a = a +1
        self.all_pager = a
        self.show_page = show_page
        self.base_url = base_url
    def start(self):
        return (self.current_page-1) * self.per_page

    def end(self):
        return self.current_page * self.per_page


    def pager(self):
        # v = "<a href='/custom.html?page=1'>1</a><a href='/custom.html?page=2'>2</a>"
        # return v
        page_list = []

        half = int((self.show_page-1)/2)

        # 如果数据总页数 < 11
        if self.all_pager < self.show_page:
            begin = 1
            stop = self.all_pager + 1
        # 如果数据总页数 > 11
        else:
            # 如果当前页 <=5,永远显示1,11
            if self.current_page <= half:
                begin = 1
                stop = self.show_page + 1
            else:
                if self.current_page + half > self.all_pager:
                    begin = self.all_pager - self.show_page + 1
                    stop = self.all_pager + 1
                else:
                    begin = self.current_page - half
                    stop = self.current_page + half + 1

        if self.current_page <= 1:
            prev = "<li><a href='#'>上一页</a></li>"
        else:
            prev = "<li><a href='%s?page=%s'>上一页</a></li>" %(self.base_url,self.current_page-1,)
        page_list.append(prev)

        for i in range(begin,stop):
            if i == self.current_page:
                temp = "<li class='active'><a  href='%s?page=%s'>%s</a></li>" %(self.base_url,i,i,)
            else:
                temp = "<li><a href='%s?page=%s'>%s</a></li>" %(self.base_url,i,i,)
            page_list.append(temp)

        if self.current_page >= self.all_pager:
            nex = "<li><a href='#'>下一页</a></li>"
        else:
            nex = "<li><a href='%s?page=%s'>下一页</a></li>" %(self.base_url,self.current_page+1,)
        page_list.append(nex)


        return ''.join(page_list)
#custom.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <link rel="stylesheet" href="/static/plugins/bootstrap-3.3.7-dist/css/bootstrap.css" />
</head>
<body>
    <h1>用户列表</h1>
    <ul>
        {% for row in user_list %}
            <li>{
  
  
  
  
  
  
  
    
  { row.name }}</li> {% endfor %} </ul> <nav aria-label="Page navigation"> <ul class="pagination"> { 
  
    
  { page_info.pager|safe }}
      </ul>
    </nav>
</body>
</html>

18、数据库操作

class UserGroup(models.Model):
“”"
部门 3
“”"
title = models.CharField(max_length=32)
class UserInfo(models.Model):
“”"
员工4
“”"
nid = models.BigAutoField(primary_key=True)
user = models.CharField(max_length=32)
password = models.CharField(max_length=64)
age = models.IntegerField(default=1)

​ ug = models.ForeignKey(“UserGroup”,null=True)

讯享网字符串: EmailField(CharField) IPAddressField(Field) URLField(CharField) SlugField(Field) UUIDField(Field) FilePathField(Field) FileField(Field) ImageField(FileField) CommaSeparatedIntegerField(CharField) 时间类 models.DateTimeField(null=True) 数字 num=models.InterField() num=models.FloatField() num=models.DecimalField(max_digits=30,decimal_places=10) 枚举: color_list=( (1,'黑色'), (2,'白色'), (3,'蓝色') ) color=models.IntegerField(choices=color_list) 字段参数: null=True, default='1111', db_index=True, unique=True class Meta: unique_together=( ('email','ctime'), ) index_together=( ('email','ctime'), ) 

跨表:

  1. 正向

    1.q=UserInfo.objects.all().first()

    2.UserInfo.objects.values(‘nid’,‘ug_id’)

    3.UserInfo.objects.values_list(‘nid’,‘ug_id’,‘ug_title’)

  2. 反向

    1.obj=UserGroup.objects.all().first()

    result=obj.userinfo_set.all()[userinfo对象,userinfo对象,]

    2.小写的表名

    v = UserGroup.objects.values(‘id’,‘title’)
    v = UserGroup.objects.values(‘id’,‘title’,‘小写的表名称’)
    v = UserGroup.objects.values(‘id’,‘title’,‘小写的表名称__age’)

    前面的所有数据都会显示

  3. 其他

    UserInfo.objects.all()

    UserInfo.objects.filter(id=1,id=2)

    UserInfo.objects.all().first()

    UserInfo.objects.all().count()

    UserInfo.objects.all().delete()

    UserInfo.objects.all().update()

    UserInfo.objects.all()[1:19]

    跨表:

    1. 正向:

      UserInfo.filter(‘ut__title’=’ ').values()

      1. 反向

        UserGroup.filter(‘userinfo__title’=’ ').values()

19、CSRF跨站请求伪造

a、基本应用

form表单中添加 {% csrf_token %} 

b、全站禁用

讯享网#'django.middleware.csrf.CsrfViewMiddleware' 

c、局部禁用

django.middleware.csrf.CsrfViewMiddleware

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt

def csrf1(request):

​	if request.method=='GET':

​		return render(request,'csrf1.html')

​	else:

​		return HttpResponse('ok')

d、局部使用

讯享网#'django.middleware.csrf.CsrfViewMiddleware' from django.views.decorators.csrf import csrf_exempt,csrf_protect @csrf_protect 

e、特殊CBV

from django.views import View from django.utils.decorators import method_decorator @method_decorator(csrf_protect,name='dispatch') class Foo(View): ​ def get(self,request): ​ pass ​ def post(self,request): ​ pass 

CBV中添加装饰器

讯享网 PS:CBV中添加装饰器 def wrapper(func): def inner(*args,kwargs): return func(*args,kwargs) return inner # 1. 指定方法上添加装饰器 # class Foo(View): # # @method_decorator(wrapper) # def get(self,request): # pass # # def post(self,request): # pass # 2. 在类上添加 # @method_decorator(wrapper,name='dispatch') # class Foo(View): # # def get(self,request): # pass # # def post(self,request): # pass 

Ajax提交数据时候,携带CSRF

-data

-cookie中获取,添加到请求头

a.放置在data中携带
<form method="POST" action="/csrf1.html">
    {% cerf_token %}
    <input id='user' type="text" name="user" />
    <input type="submit" value="提交" />
    <a onlick="submitForm();">Ajax提交</a>
</from>
<script src="/static/jquery-1.12.4.js"></script>
<script>
	function submitForm(){
        var csrf=$('input[name="csrfmiddlewaretoken"]').val();
        var user=$('#user').val();
        $.ajax({
            url:'/csrf1.html',
            type:'POST',
            data:{"user":user,'csrfmiddlewaretoken':csrf},
            success:function(arg){
                
            }
        })
    }
</script>
b.放在请求头中
<form method="POST" action="/csrf1.html">
    {% cerf_token %}
    <input id='user' type="text" name="user" />
    <input type="submit" value="提交" />
    <a onlick="submitForm();">Ajax提交</a>
</from>
<script src="/static/jquery-1.12.4.js"></script>
<script src="/static/jquery.cookie.js"></script>
<script>
	function submitForm(){
        var csrf=$('input[name="csrfmiddlewaretoken"]').val();
        var user=$('#user').val();
        $.ajax({
            url:'/csrf1.html',
            type:'POST',
            headers:{'X-CSRFToken':token},
            data:{"user":user},
            success:function(arg){
                
            }
        })
    }
</script>

20、session

cookie:保存在客户端浏览器上的键值对

session: 保存在服务端的数据(本质是键值对)

​ 应用:依赖cookie

​ 作用:保持会话(web网站)

​ 好处:敏感信息不会直接给客户端

讯享网new_user = models.User.objects.create() new_user.name = username new_user.password = hash_code(password1) # 使用加密密码 new_user.email = email new_user.sex = sex new_user.save() 
 <div> <form action="/updateinfo/" method="POST" enctype="multipart/form-data"> <div class="updateImg"> <img src="{ 
  
    
  { account.photo.url }}" alt=""/></div> <input name="photo" type="file" id="exampleInputFile"> <button id="photo" class="btn btn-danger" type="submit">上传头像</button> </form> </div> 
讯享网def updateinfo(request):
    if request.method == 'POST':
        # img = request.FILES.get('photo')
        # user = request.FILES.get('photo').name
        new_img = models.mypicture(
            photo=request.FILES.get('photo'),  # 拿到图片
            user=request.FILES.get('photo').name # 拿到图片的名字
        )
        new_img.save()  # 保存图片
        return HttpResponse('上传成功!')

    return render(request, 'login/lianxi.html')
小讯
上一篇 2025-02-16 15:26
下一篇 2025-02-18 10:36

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/68341.html