• django-session,CBV,ORM实例


      1 from django.shortcuts import render,HttpResponse,redirect
      2 from  django.core.paginator import Paginator
      3 from app01 import  models
      4 
      5 # Create your views here.
      6 # def edit(request,a1):
      7 #
      8 #     return HttpResponse('=========')
      9 
     10 
     11 
     12 # def index(request):
     13 #     list=['json','tony','python']
     14 #     from app01 import models
     15 #     #add
     16 #     # models.usergroup.objects.create(title='销售部')
     17 #     models.UserInfo.objects.create(username='李柔',password='123',ug_id='1')
     18 #
     19 #     #查询
     20 #     models.usergroup.objects.filter(id__gt=2).update(title='销售')
     21 #     """
     22 #     大于 __gt
     23 #     小于 __lt
     24 #
     25 #     """
     26 #
     27 #     user_list=models.UserInfo.objects.all()
     28 #
     29 #
     30 #     #user_list 类型 queryset类型
     31 #     for row in user_list:
     32 #         print(row.username)
     33 #
     34 #
     35 #
     36 #
     37 #
     38 #     return render(request,'index.html',{'user_list':user_list})
     39 
     40 #以下是cbv架构
     41 """
     42 get 查
     43 post 创建
     44 put 更新
     45 delete 删除
     46 
     47 在models里面创建表 
     48 from django.db import models
     49 class userinfo(models.Model):
     50    name=models.CharField(max_length=32)
     51    password=models.CharField(max_length=32)
     52 
     53 database的增删改查操作:在views中
     54 增加:
     55 models.userinfo.objects.create(title='salary')
     56 
     57 删除
     58 models.userinfo.objects.filter(id__gt=1).delete()
     59 
     60 更改
     61 models.userinfo.objects.filter(id__gt=1).update(name='qst')
     62 id__lt=1  ---> lower than 1
     63 id__gt=1 :greater than  1
     64 
     65 
     66 查询:
     67 models.userinfo.objects.all()
     68                         .filter(id=1)
     69                         .filter(id__gt=1)
     70                         .filter(id__lt=1)
     71 
     72 
     73 
     74 
     75 
     76 
     77 
     78 
     79 
     80 
     81 
     82 
     83 """
     84 
     85 from django.views import View
     86 
     87 class login(View):#继承view作为父类
     88     #写一个装饰器,在不更改原函数内部的条件下,增加函数执行前后的动作
     89     def dispatch(self, request, *args, **kwargs):#重写函数
     90         print('begin......')
     91         obj=super(login,self).dispatch(request,*args,**kwargs)
     92         print('over......')
     93         return obj
     94 
     95 
     96     def get(self,request):
     97         return render(request,'login.html')
     98 
     99     def post(self,request):
    100         print(request.POST.get('name'))
    101         return HttpResponse('ok post')
    102 
    103 
    104 def test(request):
    105     # models.usertype.objects.create(title='普通玩家')
    106     # models.usertype.objects.create(title='二玩家')
    107     # models.usertype.objects.create(title='人民币玩家')
    108     # models.UserInfo.objects.create(username='马家军',password='123',ut_id=1)
    109     # models.UserInfo.objects.create(username='钱jb',password='123',ut_id=2)
    110     # models.UserInfo.objects.create(username='洛凯',password='123',ut_id=3)
    111     user_info=models.UserInfo.objects.all()#queryset格式
    112     obj=models.usertype.objects.all().first()#对象,能点出来相关联的东西
    113     result=models.UserInfo.objects.values('username','password','ut__title') #神奇的下划线
    114     for i in result:
    115         print(i)
    116 
    117     """
    118     [obj,obj,obj]
    119     .filter(id__gt=1)
    120     .all()  对象,批量拿一般是queryset类型
    121     
    122     
    123     [{},{},{}]
    124     .values('id','name')  字典
    125     
    126     
    127     
    128     [(),(),(),]
    129     .values_list('id','name')  元组   
    130     """
    131     for item in user_info:
    132         print(item.username,'   ',item.password,'   ',item.ut.title)
    133         #ut是外键,代指一行数据,直接拿来用
    134 
    135     for row in obj.userinfo_set.all():
    136         print('对应的是:',row.username)
    137     return  HttpResponse('...')
    138 """
    139 分页器Paginator,返回一个paginator对象  
    140 paginator 对象
    141 
    142 paginator.page(xxx)
    143 has_next 有下一页
    144 next_page_number 下一页的页码
    145 has_previous 有前一页
    146 previous_page_number 前一页页码
    147 
    148 """
    149 def index(request):
    150     user_list=models.UserInfo.objects.all()
    151     # for i in range(0,200):
    152     #     name='root'+str(i)
    153     #     models.UserInfo.objects.create(username=name,password=123,ut_id=1)
    154     paginator=Paginator(user_list,10)
    155     current_page=request.GET.get('page')
    156     print(current_page)
    157     try:
    158         posts=paginator.page(current_page)
    159     except Exception as e:
    160         print(e)
    161         posts=paginator.page(1)
    162     return render(request,'index1.html',{'posts':posts})
    163 
    164 
    165 """
    166 
    167 反向操作:关联的表名(想取的)小写加_(下划线) 
    168 userinfo_set.all()
    169 """
    170 
    171 def custom(request):
    172     all_count=models.UserInfo.objects.all().count()#总个数
    173     # print(all_count)
    174     current_page=request.GET.get('page')
    175     print(current_page)
    176     page_info=pageinfo(current_page,all_count,10,11)#对象
    177     user_list=models.UserInfo.objects.all()[page_info.start():page_info.end()]#注意是冒号,表示取的范围
    178     return render(request,'custom.html',{'user_list':user_list,'page_info':page_info})
    179 
    180 class pageinfo(object):
    181     def __init__(self,current_page,all_count,per_page,show_page):
    182         """
    183         :param current_page:
    184         :param all_count: 数据库中的记录总条数
    185         :param per_page: 每页显示的行数
    186 
    187         """
    188         try:
    189             self.current_page=int(current_page)
    190 
    191         except Exception as e:
    192             print(e)
    193             self.current_page=1
    194         self.per_page=per_page
    195 
    196         self.show_page=show_page
    197 
    198         a,b=divmod(all_count,per_page)
    199 
    200         if b:
    201             a=a+1
    202 
    203         self.all_page=a#总页码
    204         half=int((show_page-1)/2)
    205 
    206         self.begin=self.current_page-half
    207         if self.current_page<=5:
    208             self.begin=1
    209         self.stop=self.current_page+half+1
    210         if self.current_page>=self.all_page-half:
    211             self.stop=self.all_page+1
    212 
    213     def start(self):
    214         return (self.current_page-1)*self.per_page
    215 
    216     def end(self):
    217          return self.current_page*self.per_page
    218 
    219     def pager(self):
    220         # v="<a href='/custom.html?page=1'>1</a>"
    221         # print('=====================ok======================')
    222         # return v
    223         page_list=[]
    224         if self.current_page==1:
    225            prev="<li><a  href='#'>上一页</a></li>"
    226         else:prev= "<li><a href='/custom.html?page=%s'>上一页</a></li>"%(self.current_page-1)
    227 
    228         page_list.append(prev)
    229 
    230 
    231         if self.current_page==self.all_page:
    232             next="<li><a  href='#'>下一页</a></li>"
    233         else:next="<li><a href='/custom.html?page=%s'>下一页</a></li>"%(self.current_page+1)
    234         page_list.append(next)
    235 
    236 
    237         for i in range(self.begin,self.stop):
    238             if i==self.current_page:
    239               temp="<li class='active'><a  href='/custom.html?page=%s'>%s</a></li>"%(i,i)
    240             else:
    241                 temp = "<li><a  href='/custom.html?page=%s'>%s</a></li>" % (i, i)
    242 
    243                 # temp="<a style='display:inline-block;padding:5px' href='/custom.html?page=%s'>%s</a>"%(i,i)
    244             # elif self.current_page-5==i:
    245             #     temp="<a style='display:inline-block;padding:5px' href='/custom.html?page=%s'>上一页</a>"%(self.current_page-1,)
    246             # else:
    247             #  temp="<a style='display:inline-block;padding:5px' href='/custom.html?page=%s'>%s</a>"%(i,i)
    248 
    249             page_list.append(temp)
    250         print(''.join(page_list))
    251         return ''.join(page_list)#把列表用字符串传
    252 
    253 
    254 def test01(request):
    255     # user_list=models.UserInfo.objects.all().order_by('-ut_id',)#-ut_id 从大到小
    256     from django.db.models import Count,Sum,Max,Min,F,Q
    257     user_list=models.UserInfo.objects.values('ut_id').annotate(number=Count('nid')).filter(number__gt=3)
    258     """
    259     F  在update时,取数据库里面原来的数
    260     
    261     =================================================================================
    262     Q
    263      # Q  参考资产管理 :加入设备,有很多台设备,属性为已使用,公司为不同公司。每个类中用|即or连接,不同类用and &连接 
    264         #
    265 ***********************************************************************************
    266         # 方式一:
    267         # Q(nid__gt=10)
    268         # Q(nid=8) | Q(nid__gt=10)-------->>>>>>filter('nid'=8,'nid_gt'=10) 方式一是不必要的,一般应用都是方式二
    269         # Q(Q(nid=8) | Q(nid__gt=10)) & Q(caption='root')
    270 **********************************************************************************
    271         # 方式二:采用对象的方式
    272         # con = Q()
    273         
    274         # q1 = Q()
    275         # q1.connector = 'OR'
    276         # q1.children.append(('id', 1))
    277         # q1.children.append(('id', 10))
    278         # q1.children.append(('id', 9))
    279         # q2 = Q()
    280         
    281         # q2.connector = 'OR'
    282         # q2.children.append(('c1', 1))
    283         # q2.children.append(('c1', 10))
    284         # q2.children.append(('c1', 9))
    285         # con.add(q1, 'AND')
    286         # con.add(q2, 'AND')
    287         #
    288         # models.Tb1.objects.filter(con)
    289     ================================================================================================
    290     extra
    291     
    292         # extra(self, select=None, where=None, params=None, tables=None, order_by=None, select_params=None)
    293         
    294         #    Entry.objects.extra(select={'new_id': "select col from sometable where othercol > %s"}, select_params=(1,))
    295         
    296         ----------->>>   映射 select:里面写sql语句   select_param: sql中的参数
    297         
    298         #    Entry.objects.extra(where=['headline=%s'], params=['Lennon'])
    299         
    300         ----------->>> 条件  where :联想到filter, params:where中参数
    301         
    302         #    Entry.objects.extra(select={'new_id': "select id from tb where id > %s"}, select_params=(1,), order_by=['-nid'],table=['usertype'])
    303         
    304         ----------->>> order: 排序 ,-nid就是倒序排;  
    305         
    306         ----------->>>表名  table :加一个表, select * from 本表,usertype(其他表)
    307         
    308      ================================================================================================
    309       # 执行原生SQL
    310         #
    311         # from django.db import connection, connections
    312         # cursor = connection.cursor()  # cursor = connections['default'].cursor()#DATABASE里面的default默认连接sqlite
    313         # cursor.execute('SELECT * from auth_user where id = %s', [1]);
    314         # row = cursor.fetchone()
    315         
    316         
    317     ============================================================================
    318     def aggregate(self, *args, **kwargs):
    319    # 聚合函数,获取字典类型聚合结果
    320    from django.db.models import Count, Avg, Max, Min, Sum
    321    result = models.UserInfo.objects.aggregate(k=Count('u_id', distinct=True), n=Count('nid'))
    322    ===> {'k': 3, 'n': 4}
    323    
    324    ===============================================================================
    325    def create(self, **kwargs):
    326    # 创建对象
    327    res=models.usertype.create(**{'title':'超级用户'})
    328    res.id:last_row_id
    329    
    330    
    331    ==================================================================================
    332    select_related('xxx'):第一次连接的时候就主动做连表操作,提升性能
    333         
    334     
    335     
    336     
    337     
    338     
    339     
    340     """
    341     models.UserInfo.objects.all().update(ut_id=F('ut_id')-1)#某一列减一
    342     # user_list = models.UserInfo.objects.values('ut_id').annotate(number=Sum('nid'))
    343     print(user_list)
    344     #<QuerySet [{'ut_id': 1, 'xxx': 1}, {'ut_id': 2, 'xxx': 4}, {'ut_id': 3, 'xxx': 2}]>
    345     #SELECT `app01_userinfo`.`ut_id`, COUNT(`app01_userinfo`.`nid`) AS `xxx` FROM `app01_userinfo` GROUP BY `app01_userinfo`.`ut_id` ORDER BY NULL
    346     return  HttpResponse('==========okk========')
    347 
    348 def test02(request):
    349     # boy_info=[
    350     #     models.boy(name='邱舒庭'),
    351     #     models.boy(name='马家军'),
    352     #     models.boy(name='钱jb'),
    353     #     models.boy(name='罗海波'),
    354     #     models.boy(name='陆家新')
    355     #
    356     # ]
    357     #
    358     # models.boy.objects.bulk_create(boy_info,5)
    359     #
    360     # girl_info = [
    361     #     models.girl(nick='小鱼'),
    362     #     models.girl(nick='小虾'),
    363     #     models.girl(nick='小猫'),
    364     #     models.girl(nick='小狗'),
    365     #     models.girl(nick='小雨')
    366     #
    367     # ]
    368     #
    369     # models.girl.objects.bulk_create(girl_info,5)
    370     # models.lov.objects.create(b_id=2,g_id=1)
    371     # models.lov.objects.create(b_id=2,g_id=2)
    372     # models.lov.objects.create(b_id=3,g_id=3)
    373     # models.lov.objects.create(b_id=2,g_id=3)
    374     # obj=models.boy.objects.filter(name='马家军').first()
    375     # love_list=obj.lov_set.all()
    376     # print(love_list)
    377     # for row in love_list:
    378     #     print(row.g.nick)
    379     # love_list=models.lov.objects.filter(b__id='2').select_related('g')
    380     # for item in love_list:
    381     #  print(item.g.nick)
    382     #
    383     # return HttpResponse('============okk==================')
    384 
    385 
    386 
    387     obj=models.boy.objects.filter(id=2).first()#不加first ,就是一个queryset格式,里面封装了对象,用first取出对象
    388     print(obj.name)
    389     list=obj.m.all()
    390     for row in list:
    391       print(row.nick)
    392 
    393 
    394     return HttpResponse('*************okk**************')
    395 
    396 
    397 
    398     # love_list=obj.m.all()
    399     # print(love_list)
    400 
    401 """
    402 csrf: 跨站请求伪造
    403 1.form 表单中添加
    404 {%csrf_token%}
    405 
    406 2.全站禁用  在settings里面注释掉CSRF
    407 
    408 3.局部禁用
    409 
    410 添加装饰器 
    411  from django.views.decorators.csrf import csrf_exempt
    412  @csrf_exempt
    413  
    414 4.局部使用
    415  from django.views.decorators.csrf import csrf_protect
    416 @csrf_protect
    417 
    418 5.CBV:在类上加
    419 
    420 @method_decorator(csrf_protect,name='dispatch')
    421 
    422 """
    423 
    424 def test03(request):
    425     return render(request,'test03.html',{'userinfo':{'k1':'qst','k2':'v2'}})
    426 
    427 
    428 
    429 """
    430 3.session
    431 
    432 
    433 cookie:保存在客户浏览器上的键值对
    434 
    435 session:
    436 保存在服务端的数据(本质是键值对)
    437 应用:依赖cookie
    438 作用:保持回话(web网站)
    439 好处:敏感信息不会保存在用户电脑上
    440 
    441 request.session
    442 -增删改
    443 -获取随机字符串
    444 -主动设置超时时间
    445  
    446 
    447 
    448 
    449 
    450 
    451 
    452 
    453 
    454 
    455 
    456 
    457 4.中间件
    458 
    459 """
    460 
    461 def test04(request):
    462     if request.method=='GET':
    463         return  render(request,'test04.html')
    464     else:
    465         username=request.POST.get('info')
    466         password=request.POST.get('pwd')
    467         print(username,password)
    468         if username=='alex' and password=='123':
    469             #1.生成随机字符串
    470             #2.cookie发给客户端
    471             #3.服务端保存  {随机字符串1:{'usename':'alex'......}}
    472             request.session['username']='alex'
    473             request.session['password']='123'
    474 
    475             return redirect('/verify.html')
    476         else:
    477             return render(request,'test04.html',{'msg':'用户名或密码错误'})
    478 def verify(request):
    479   """
    480   获取客户端cookie中的随机字符串
    481   去session中查找有没有随机字符串
    482   去session对应key的value中查看是否有username
    483   
    484   """
    485   v=request.session.get('username')
    486 
    487 
    488   if v:
    489       return HttpResponse('登录成功 %s 先生/女士'%v)
    490 
    491 
    492   else:return redirect('/test04.html')
  • 相关阅读:
    Linux(Debian、Ubuntu、Deepin等)安装最新版Chrome Unstable
    JavaScript根据经纬度获取距离信息
    CSS滚动条样式定制
    Linux下 Apache Vhost 配置 防止403
    Unity减小安装包的体积(210MB减小到7MB)
    Ubuntu17.04配置LNMP(Nginx+PHP7+MySQL)简单教程 快速 易学 简单易懂
    Yii2项目实现Markdown功能 在线Markdown编辑器
    Gradle全局代理配置
    Angular4.0从入门到实战打造在线竞拍网站学习笔记之三依赖注入
    Python使用PyMysql操作数据库
  • 原文地址:https://www.cnblogs.com/clement-chiu/p/11282027.html
Copyright © 2020-2023  润新知