Django笔记

python版本 3.+

Django version 1.0.1

一、Django基础 

Django笔记:
    1、Django请求生命周期
        -> URL对应关系(匹配) -> 视图函数 -> 返回用户字符串
        -> URL对应关系(匹配) -> 视图函数 -> 打开一个HTML文件,读取内容
        
    2、创建django projcet

        django-admin startproject mysite
        

        ..
        
        mysite
            mysite
                - 配置文件
                - url.py
                - settings.py
            
        cd mysite
        python manage.py startapp cmdb
        
        mysite
            mysite
                - 配置文件
                - url.py
                - settings.py
            cmdb
                - views.py
                - admin.py
                - models.py # 创建数据库表

    3、配置
        
        模板路径
        静态文件路径
        # CSRF
        
    4、编写程序

        a. url.py
            
            /index/    ->   func
            
        b. views.py
            
            def func(request):
                # 包含所有的请求数据
                ...
                return HttpResponse('字符串')
                return render(request, 'index.html', {''})
                retrun redirect('URL')
                
        c. 模板语言
            return render(request, 'index.html', {'li': [11,22,33]})
            
            {% for item in li %}
                <h1>{{item}}</h1>
            {% endfor %}
            
            
            ***********  索引用点 **********
            <h2> {{item.0 }} </h2>

一、路由系统,URL
    1、url(r'^index/', views.index),    
       url(r'^home/', views.Home.as_view()),
    2、url(r'^detail-(\d+).html', views.detail),  
    3、url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html', views.detail)
       
       PS:
            def detail(request, *args,**kwargs):
                pass
    
       实战:
            a. 
                url(r'^detail-(\d+)-(\d+).html', views.detail),
                
                def func(request, nid, uid):
                    
                    pass
            
                def func(request, *args):
                    args = (2,9)
                    
                    
                def func(request, *args, **kwargs):
                    args = (2,9)
       
            b. 
                url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html', views.detail)
                
                def func(request, nid, uid):
                    pass
                    
                def funct(request, **kwargs):
                    kwargs = {'nid': 1, 'uid': 3}
                    
                def func(request, *args, **kwargs):
                    args = (2,9)
    4、 name
        
        对URL路由关系进行命名, ***** 以后可以根据此名称生成自己想要的URL *****
        
        url(r'^asdfasdfasdf/', views.index, name='i1'),
        url(r'^yug/(\d+)/(\d+)/', views.index, name='i2'),
        url(r'^buy/(?P<pid>\d+)/(?P<nid>\d+)/', views.index, name='i3'),
        
        
        
        def func(request, *args, **kwargs):
            from django.urls import reverse
            
            url1 = reverse('i1')                              # asdfasdfasdf/
            url2 = reverse('i2', args=(1,2,))                 # yug/1/2/
            url3 = reverse('i3', kwargs={'pid': 1, "nid": 9}) # buy/1/9/
        
        
        xxx.html
            
            {% url "i1" %}               # asdfasdfasdf/
            {% url "i2" 1 2 %}           # yug/1/2/
            {% url "i3" pid=1 nid=9 %}   # buy/1/9/
        
        注:
            # 当前的URL
            request.path_info 
    5、多级路由
        
        project/urls.py
            from django.conf.urls import url,include
            from django.contrib import admin

            urlpatterns = [
                url(r'^cmdb/', include("app01.urls")),
                url(r'^monitor/', include("app02.urls")),
            ]
            
        app01/urls.py
            from django.conf.urls import url,include
            from django.contrib import admin
            from app01 import views

            urlpatterns = [
                url(r'^login/', views.login),
            ]
            
        app02/urls.py
            from django.conf.urls import url,include
            from django.contrib import admin
            from app02 import views

            urlpatterns = [
                url(r'^login/', views.login),
            ]
    
    6、默认值(欠)
    
    7、命名空间(欠)
    
    
二、视图
    1、获取用户请求数据
        request.GET
        request.POST
        request.FILES
        PS:
            GET:获取数据                
            POST:提交数据
            
    2、checkbox等多选的内容
        request.POST.getlist()
    3、上传文件
        # 上传文件,form标签做特殊设置
        obj = request.FILES.get('fafafa')
        obj.name
        f = open(obj.name, mode='wb')
        for item in obj.chunks():
            f.write(item)
        f.close()
    
    4、FBV & CBV
       function base view
       
        url.py
            index -> 函数名
            
        view.py
            def 函数(request):
                ...
        ====/index/ -> 函数名
            
        /index/ ->====》
        
        建议:两者都用
        
    5、装饰器
        欠

    
三、模板
    
    

四、ORM操作
    select * from tb where id > 1
    # 对应关系
    models.tb.objects.filter(id__gt=1)
    models.tb.objects.filter(id=1)
    models.tb.objects.filter(id__lt=1)
    
    创建类
    
    a. 先写类
        from django.db import models

        # app01_userinfo
        class UserInfo(models.Model):
            # id列,自增,主键
            # 用户名列,字符串类型,指定长度
            username = models.CharField(max_length=32)
            password = models.CharField(max_length=64)
        
    b. 注册APP

        INSTALLED_APPS = [
            'django.contrib.admin',
            'django.contrib.auth',
            'django.contrib.contenttypes',
            'django.contrib.sessions',
            'django.contrib.messages',
            'django.contrib.staticfiles',
            'app01',
        ]
    c. 执行命令
        python manage.py  makemigrations
        python manage.py  migrate
        
    d. ********** 注意 ***********
        Django默认使用MySQLdb模块链接MySQL
        主动修改为pymysql,在project同名文件夹下的__init__文件中添加如下代码即可:
            import pymysql
            pymysql.install_as_MySQLdb()
    
    1. 根据类自动创建数据库表
        # app下的models.py
    
        python manage.py  makemigrations
        python manage.py  migrate
        
        
        字段:
            字符串类型
            
            
            数字
            
            
            时间
            
            
            二进制
            
            自增(primary_key=True)
            
        字段的参数:
            null               -> db是否可以为空
            default            -> 默认值
            primary_key        -> 主键
            db_column          -> 列名
            db_index           -> 索引
            unique               -> 唯一索引
            unique_for_date    -> 
            unique_for_month
            unique_for_year
            auto_now           -> 创建时,自动生成时间
            auto_now_add       -> 更新时,自动更新为当前时间
            
                # obj = UserGroup.objects.filter(id=1).update(caption='CEO')
                # obj = UserGroup.objects.filter(id=1).first()
                # obj.caption = "CEO"
                # obj.save()
                
            choices              -> django admin中显示下拉框,避免连表查询
            blank             -> django admin是否可以为空
            verbose_name      -> django admin显示字段中文
            editable          -> django admin是否可以被编辑
            error_messages    -> 错误信息欠
            help_text         -> django admin提示
            validators          -> django form ,自定义错误信息(欠)
            
            
            创建 Django 用户:python manage.py createsuperuser
            
            
            
            
    2. 根据类对数据库表中的数据进行各种操作
    
        一对多:
        
            a. 外检
            b. 
                外键字段_id
            c.
                models.tb.object.create(name='root', user_group_id=1)
                
            d. 
                
                userlist = models.tb.object.all()
                for row in userlist:
                    row.id
                    row.user_group_id
                    row.user_group.caption
                    
                    

    
参考:http://www.cnblogs.com/wupeiqi/articles/5246483.html
View Code

 

二、自定义分页

1.pagination.py

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# Author:Du Fei
"""
分页思路:
     如果:总页数 < 11
        start_index =0
        end_index = 总页数
    else:
        当前页<=6
            start_index=1
            end_index=11
        else:
            start_index = 当前页 -5
            end_index=当前页 +5+1
            如果 当前页 + 5 > 总页数:
                end_index = 总页数 +1
                
当前页current_page
数据总量:data_count
显示页数:pager_num
每页显示10条数据:per_page_count

显示页数开始索引函数:start()
显示页数结束索引函数:end()
总页数:total_count
"""
from django.utils.safestring import mark_safe
class Page:
    def __init__(self,current_page,data_count,per_page_count=10,pager_num=11):
        self.current_page=current_page
        self.data_count = data_count
        self.per_page_count =per_page_count
        self.pager_num = pager_num

    @property
    def start(self):
        return (self.current_page-1) *self.per_page_count
    @property
    def end(self):
        return self.current_page * self.per_page_count

    @property
    def total_count(self):
        # v =len(LIST)
        v, y = divmod(self.data_count, self.per_page_count)
        if y:
            v += 1
        return v
    def page_str(self,base_url):

        page_list = []
        # total_count总页数
        if self.total_count < self.pager_num:
            start_index = 1
            end_index = self.total_count + 1
        else:
            if self.current_page <= (self.pager_num + 1) / 2:
                start_index = 1
                end_index = self.pager_num + 1
            else:
                start_index = self.current_page - (self.pager_num - 1) / 2
                end_index = self.current_page + (self.pager_num + 1) / 2
                if (self.current_page + (self.pager_num - 1) / 2) > self.total_count:
                    end_index = self.total_count + 1
                    start_index = self.total_count - self.pager_num + 1

        if self.current_page == 1:
            prev = '<a class="page" href="javascript:void(0)">上一页</a>'
        else:
            prev = '<a class="page" href="%s?p=%s">上一页</a>' % (base_url,self.current_page - 1,)
        page_list.append(prev)
        for i in range(int(start_index), int(end_index)):
            if i == self.current_page:
                temp = '<a class="page active" href="%s?p=%s">%s</a>' % (base_url,i, i)
            else:
                temp = '<a class="page" href="%s?p=%s">%s</a>' % (base_url,i, i)
            page_list.append(temp)

        if self.current_page == self.total_count:
            nex = '<a class="page" href="javascript:void(0)">下一页</a>'
        else:
            nex = '<a class="page" href="%s?p=%s">下一页</a>' % (base_url,self.current_page + 1,)
        page_list.append(nex)

        # 跳转
        jump = """
        <input type='text'  /><a onclick='jumpTo(this, "%s?p=");'>GO</a>
        <script>
            function jumpTo(ths,base){
                var val = ths.previousSibling.value;
                location.href = base + val;
            }
        </script>
        """ % (base_url,)
        page_list.append(jump)
        # page_str ="".join(page_list)
        page_str = mark_safe("".join(page_list))

        return page_str
pagination.py

2.views.py

from django.shortcuts import render
from utils import pagination
LIST =[]
for i in range(500):
    LIST.append(i)
def user_list(request):
    #current_page当前页
    current_page = request.GET.get('p',1)
    current_page = int(current_page)

    page_obj = pagination.Page(current_page,len(LIST))

    data = LIST[page_obj.start:page_obj.end]
    page_str = page_obj.page_str("/user_list/")

    return render(request,'user_list.html',{'li':data,'page_str':page_str})
views.py

3.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .pagination .page{
            display: inline-block;
            padding: 5px;
            background-color: cyan;
            margin: 5px;
        }
        .pagination .page.active{
            background-color: brown;
            color: white;
        }
    </style>
</head>
<body>
    <ul>
        {% for item in li %}
            {% include 'li.html' %}
        {% endfor %}
    </ul>
    <div class="pagination">
        {{ page_str }}
    </div>
</body>
</html>
user_list.html

 三.原生ajax

1.get请求方式

views.py

from django.shortcuts import render,HttpResponse
def ajax_json(request):
    ret ={'code':True,'data':None}
    print(ret)
    print(request.method)
    import json
    return HttpResponse(json.dumps(ret))
View Code

ajax.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <input type="text" />
    <input type="button" value="Ajax1" onclick="Ajax1();"/>
<script>
    get请求
    function Ajax1() {
        var xhr = new XMLHttpRequest();
        xhr.open('GET','/ajax_json/',true);
        xhr.onreadystatechange = function(){
          if( xhr.readyState == 4){
              //接收完毕
              console.log(xhr.responseText);
              var obj=JSON.parse(xhr.responseText);
              console.log(obj);
              console.log(obj.code)
          }
        };
        xhr.setRequestHeader('k1','v1');
        xhr.send("name=root;pwd=123")
    }
</script>
</body>
</html>
View Code

2.post请求方式

views.py

from django.shortcuts import render,HttpResponse
def ajax_json(request):
    print(request.POST)
    ret ={'code':True,'data':None}
    print(ret)
    print(request.method)
    import json
    return HttpResponse(json.dumps(ret))
View Code

 

ajax.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <input type="text" />
    <input type="button" value="Ajax1" onclick="Ajax1();"/>
<script>
    //opst请求
    function Ajax1() {
        //浏览器兼容
        function getXHR(){
            var xhr = null;
            if(XMLHttpRequest){
                xhr = new XMLHttpRequest();
            }else{
                xhr = new ActiveXObject("Microsoft.XMLHTTP");
            }
            return xhr;

        }

        {#var xhr = new XMLHttpRequest();#}
        var xhr = getXHR();
        xhr.open('POST','/ajax_json/',true);
        xhr.onreadystatechange = function(){
          if( xhr.readyState == 4){
              //接收完毕
              {#console.log(xhr.responseText);#}
              var obj=JSON.parse(xhr.responseText);
              console.log(obj);
              {#console.log(obj.code)#}
          }
        };
        {#xhr.setRequestHeader('k1','v1');#}
        //设置请求头
        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset-UTF-8');
        xhr.send("name=root;pwd=123")
    }

</script>
</body>
</html>
View Code

 四、文件上传

views.py

from django.shortcuts import render,HttpResponse
def upload_file(request):
    username = request.POST.get('username')
    fafafa = request.FILES.get('fafafa')
    import os
    img_path = os.path.join('static/imgs/',fafafa.name)
    with open(img_path,'wb') as f:
        for item in fafafa.chunks():
            f.write(item)

    ret = {'code': True , 'data': img_path}
    import json
    return HttpResponse(json.dumps(ret))
View Code

upload.html

  1 <!DOCTYPE html>
  2 <html lang="en">
  3 <head>
  4     <meta charset="UTF-8">
  5     <title>Title</title>
  6     <style>
  7         .upload{
  8             display: inline-block;
  9             padding: 10px;
 10             background-color: brown;
 11             position: absolute;
 12             top: 0;
 13             bottom: 0;
 14             right: 0;
 15             left: 0;
 16             z-index: 90;
 17         }
 18          .file{
 19            width: 100px;height: 100px;opacity: 0;
 20             position: absolute;
 21             top: 0;
 22             bottom: 0;
 23             right: 0;
 24             left: 0;
 25              z-index: 100;
 26         }
 27     </style>
 28 </head>
 29 <body>
 30     <div style="position: relative;width: 100px;height: 50px;">
 31         <input class="file" type="file" id="fafafa" name="afafaf">
 32         <a class="upload">上传</a>
 33     </div>
 34     <p>aaaaaa</p>
 35     <input type="submit" value="提交XHR" onclick="xhrSubmit();"/>
 36     <input type="submit" value="提交jQuery" onclick="jqSubmit();"/>
 37 
 38     <hr/>
 39     <form id="form1" action="/upload_file/" method="POST" enctype="multipart/form-data" target="ifm1">
 40         <iframe id="ifm1" name="ifm1" style="display: none;"></iframe>
 41         <input type="file" name="fafafa" onchange="changeUpalod();" />
 42 {#        <input type="submit" onclick="iframeSubmit();" value="Form提交"/>#}
 43     </form>
 44     <div id="preview"></div>
 45 
 46 
 47     <script src="/static/jquery-1.12.4.js"></script>
 48     <script>
 49         function changeUpalod() {
 50             $('#ifm1').load(function(){
 51                 var text = $('#ifm1').contents().find('body').text();
 52                 var obj = JSON.parse(text);
 53 
 54                 $('#preview').empty();
 55                 var imgTag = document.createElement('img');
 56                 imgTag.src = "/" + obj.data;
 57                 $('#preview').append(imgTag);
 58             });
 59             $('#form1').submit();
 60         }
 61 
 62          function jqSubmit() {
 63              var file_obj = document.getElementById('fafafa').files[0];
 64 
 65              var fd = new FormData();
 66              fd.append('username', 'root');
 67              fd.append('fafafa', file_obj);
 68              $.ajax({
 69                  url:'/upload_file/',
 70                  type:'POST',
 71                  data:fd,
 72                  processData:false,
 73                  contentType:false,
 74                  success:function (arg,a1,a2) {
 75                      console.log(arg);
 76                      console.log(a1);
 77                      console.log(a2);
 78 
 79                  }
 80 
 81              })
 82 
 83          }
 84 
 85         function xhrSubmit() {
 86             //$('#fafafa')[0]
 87             var file_obj=document.getElementById('fafafa').files[0];
 88             console.log(file_obj);
 89 
 90             var fd = new FormData();
 91             fd.append('username','root');
 92             fd.append('fafafa',file_obj);
 93 
 94             var xhr = new XMLHttpRequest();
 95             xhr.open('POST','/upload_file/',true);
 96 
 97             xhr.onreadystatechange = function(){
 98             if( xhr.readyState == 4){
 99               //接收完毕
100               {#console.log(xhr.responseText);#}
101               var obj=JSON.parse(xhr.responseText);
102               console.log(obj);
103               {#console.log(obj.code)#}
104             }
105          };
106         xhr.send(fd);
107         }
108 
109         function iframeSubmit(){
110             $('#ifm1').load(function(){
111                 var text = $('#ifm1').contents().find('body').text();
112                 var obj = JSON.parse(text);
113 
114                 $('#preview').empty();
115                 var imgTag = document.createElement('img');
116                 imgTag.src = "/" + obj.data;
117                 $('#preview').append(imgTag);
118             })
119         }
120     </script>
121 
122 </body>
123 </html>
View Code

 

posted @ 2018-07-15 15:27  coding2018  阅读(156)  评论(0编辑  收藏  举报