Django基础进阶

内容回顾:

1、Django请求生命周期

                          路由(URL)           视图 (VIEW)                        数据库(MODEL)

  用户请求                                                                                     模板文件(TEMPLATES)

                                                                                                    静态文件(STATIC)

                          返回字符串给客户端

  --- URL对应关系(匹配)  --- 视图函数--->返回用户字符串

  --- URL对应关系(匹配)  --- 视图函数--->打开一个HTML文件,读取内容

 

 2、创建django project

      django-admin startproect mysite

      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.view.py

       def func(request):

            #包含所有的请求数据

            ....

            return HttpResponse('字符串')

            return render(request,'index.html',{''})

            return redirect('URL')

    c、模板语言

         {% for item in  %}

             <h1>{{item}}</h1>

          {% endfor %}

 

    ****************索引用点来取数****************

    <h2>{{item.0}}</h2>

 

一、路由系统(URL)

     1、两种提交方式:

          GET:获取数据

          POST:提交数据

   插入知识点:

       当表单要上传文件时,则须要<form>标签中添加 enctype="multipart/form-data" 语句

       这时,djaingo会认为提交的数据将按文件处理。

   

    2、几种不同的路由

  1、path('index/', views.index),  path('home/', views.Home.as_view()),

  2、path('detail-(\d+).html/', views.detail),

  3、url('^detail-(?P<nid>\d+)-(?P<uid>\d+).html', views.detail),   #推荐该参数

     PS:

               def detail(request, *args, **kwargs):
                    print(*args,**kwargs)

         实战:

           A、 url('^detail-(\d+)-(\d+).html', views.detail),

                  def detail(request, nid, uid):

                       pass

                 def detail(request,*args):                      

                      args=(2,9)

                 def detail(request,*args,**kargs):
                      args=(2,9)      

             B、url('^detail-(?P<nid>\d+)-(?P<uid>\d+).html', views.detail),

                    def detail(request, nid, uid):                      

                           pass   

                    def detail(request,**kargs):
                          kargs={'nid':1,'uid':3} 

                     def detail(request,*args,**kargs):
                          args=(2,9)      

     4、name

          对URL路由关系进行命名,*******以后可以根据此名称生成自己想要的URL********

          path('index11/', views.index,name='i1'),

          path('index11/(\d+)/(\d+)/', views.index,name='i2'),

          path('index11/(?P\d+)/(?P\d+)/', views.index,name='i3'),

        

          def func(request,*args,**kwargs):

                from  django.urls import reverse

 

             url1=reverse('i1')                                        #index11                   

             url2=reverse('i2',args=(1,2,))                      #index11/1/2

             url3=reverse('i3',kwargs={'pid':1,"nid":9})  #index11/1/9

         xxx.html

       

               {% url "i1" %}                     #index11 

               {% url "i2" 1 2 %}                #index11/1/2 #index11/1/2 #index11/1/2   #index11/1/2           #index11/1/2

               {% url "i3" pid=1 nid=9 %} #index11/1/9

 

         模板语言:

              {% url "indexx" %}

              {% url "indexx"  3 %}

         注:

             #当前的URL

              request.path_info

 

       路由分发:当存在多个APP时,则需要使用路由分发功能:

      工程级别:

      

 

      app级别:monitor

app级别:cmdb

 

6、默认值

 

 

7、命名空间

 

 

 

二、视图

     request.GET

     request.POST

     request.FILES

 

    #checkbox等多选的内容

      request.POST.getlist()

  

    #上传文件

   obj = request.FILES.get('filename')

   obj.name

   f = open(obj.name,mode='wb')

   for item in obj.chunks():

       f.write(item)

   f.close()

   注:上传文件,须对表单(form)声明:enctype="multipart/form-data"

 

表单处理

HTML文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
   <form action="/login/" method="post" enctype="multipart/form-data">
       <p>
           <input type="text" name="user" placeholder="用户名">
       </p>
       <p>
           <input type="password" name="pwd" placeholder="密码">
       </p>
       <p>
           男:<input type="radio" name="gender" placeholder="性别" value="1">
           女:<input type="radio" name="gender" placeholder="性别" value="0">
       </p>
       <p>
           男:<input type="checkbox" name="favour" placeholder="爱好" value="1">
           女:<input type="checkbox" name="favour" placeholder="爱好" value="0">
       </p>
       <p>
            <select name="city">
                <option value="sh">上海</option>
                <option value="bj">北京</option>
                <option value="tj">天津</option>
            </select>
       </p>
       <p>
            <select name="city" multiple>
                <option value="sh">上海</option>
                <option value="bj">北京</option>
                <option value="tj">天津</option>
            </select>
       </p>
       <p>
            <input type="file" name="filename" >
       </p>
        <p>
           <input type="submit" value="提交">
       </p>
   </form>
</body>
</html>

 

VIEWS文件

from django.shortcuts import render,redirect
from django.shortcuts import HttpResponse
import os

# Create your views here.

def index(request):
    return HttpResponse('Index')

def login(request):
    if request.method=="GET":
        return render(request,'login.html')
    elif request.method=="POST":
        u=request.POST.get('user')
        p=request.POST.get('pwd')
        g=request.POST.get('gender')
        print(g)
        f= request.POST.getlist("favour")
        print(f)
        file=request.POST.get('filename')
        #其实已上传到了request.FILES
        print(file)
        obj=request.FILES.get("filename")
        print(obj,type(obj),obj.name)
        file_path=os.path.join('upload',obj.name)
        f =open(file_path,mode='wb')
        for i in obj.chunks():
            f.write(i)
        f.close()

        if u=='xkj' and p=="123":
            return redirect('/index/')
        else:
            return render(request, 'login.html')
    else:
       return redirect('/index/')

4、FBV (function base view)  &   CBV (function class view)

   url.py

      index --->函数名

  view.py

      def 函数(request):

          ....

  /index/--> 函数名

 /index/-->类名

 

注意:

# from django.views import View
# class Home(View):
#
#     def dispatch(self, request, *args, **kwargs):
#         #调用父类中的dispatch方法
#         print("before")
#         result = super(Home,self).dispatch(self, request, *args, **kwargs)   
#         print('after')
#         return result
#
#     def get(self,request):
#         print(request.method)
#         return render(request,'home.html')
#
#     def post(self,request):
#         print(request.method)

from django.views import View
# 这里Home需要继承View
class Home(View):
    # 这样这里就相当于一个装饰器的功能,可以自己定制化内容
    def dispatch(self, request, *args, **kwargs):
        # 调用父类中dispatch方法
        print("before")
        result = super(Home, self).dispatch(request,*args,**kwargs)
        print("after")
        return result
    def get(self,request):
        print(request.method)
        return render(request,"home.html")
    def post(self,request):
        print(request.method)
        return render(request, "home.html")
result = super(Home,self).dispatch(self, request, *args, **kwargs) 
result = super(Home, self).dispatch(request,*args,**kwargs)

由于第一条语句dispatch方法中多了一个参数selft,所以一直报错:

折腾了老半天,然后通过网站查找才知道:原来是继承方法写错了:

正确写法:

result = super(Home, self).dispatch(request,*args,**kwargs) 

三、模板

 1、模板语言循环字典

USER_DICT={
    '1':'root1',
    '2':'root2',
    '3':'root3',
    '4':'root4',
    '5':'root5',
}

# USER_DICT={
#     '1':{'name':'root1','email':'root@live.com'},
#     '2':{'name':'root2','email':'root@live.com'},
#     '3':{'name':'root3','email':'root@live.com'},
#     '4':{'name':'root4','email':'root@live.com'},
#     '5':{'name':'root5','email':'root@live.com'},
# }
#
# USER_LIST=[
#     {'name':'root'},
#     {'name':'root'},
#     {'name':'root'},
# ]

def index(request):
    return render(request,'index.html',{'user_dict':USER_DICT})

页面:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
   <!--取字典键-->
   <ul>
       {% for row in user_dict.keys %}
       <li>{{ row }}</li>
       {% endfor %}
   </ul>
   <!--取字典值-->
   <ul>
       {% for row in user_dict.values %}
       <li>{{ row }}</li>
       {% endfor %}
   </ul>
   <!--取字典键值对-->
   <ul>
       {% for row in user_dict.items %}
       <li>{{ row }}</li>
       {% endfor %}
   </ul>
</body>
</html>

2、Django正则表达式

另一种传参

VIEWS

def detail(request,nid):
    # return HttpResponse(nid)
    detail_info = USER_DICT[nid]
    return render(request, "detail.html", {'detail_info': detail_info})

URLS

from django.contrib import admin
from django.urls import path
from django.conf.urls import url
from cmdb import  views



urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/', views.index),
    path('login/', views.login),
    path('home/', views.Home.as_view()),
    # path('detail/', views.detail),
    # path(r'^detail-(\d+).html', views.detail),
    url('^detail-(\d+).html', views.detail),
]

HMTL

 <ul>
{#       {% for k,row in user_dict.items %}#}
{#       <li><a href="/detail-{{ k }}.html" target="_blank">{{ row.name }}</a></li>#}
{#       {% endfor %}#}
       {% for k,row in user_dict.items %}
        <li><a target="_blank" href="/detail-{{ k }}.html">{{ row.name }}</a></li>
       {% endfor %}
   </ul>

 

 

四、ORM操作

select * from tb where id>1

#对应关系

models.tb.objects.filter(id__gt=1) #大于1

models.tb.objects.filter(id=1)       #等于1

models.tb.objects.filter(id__lt=1) #小于1

 

创建类

 

     A、先写类

          from django.db import models

         #cmdb_userinfo

         class UserInfo(models.Model):

from django.db import models
#默认表名:cdmb_userinfo
# Create your models here.
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',
    'cmdb',
]

C、执行命令

python manage.py makemigrations
python manage.pu migrate

D、*************注意**************

     Django默认使用MySQLdb模块链接MySQL

     主动修改改为pymysql,在project同名文件夹下的__init__文件中添加如下代码即可:

          import pymysql

          pymysql.install_as_MySQLdb()

 

1、根据类自动创建数据库表

     #app下的models.py

   

             

2、根据类对数据进行操作

#id列,自增,主键
#创建用户名列,字符串类型,指定长度
username=models.CharField(max_length=32)
password=models.CharField(max_length=64)
email=models.CharField(max_length=60)
gender=models.CharField(max_length=60,null=True)

五、ORM字段类型

 

 

六、Ajax

$.ajax({

     url:'/host',

     type:"POST",

     data:{'k1':123,'k2':‘root’},

     success:function(data){

         //data是服务器端返回的字符串
var obj=JSON.parse(data); } }) $.get $.ajax({ url:
'/host', type:"GET", data:{'k1':123,'k2':‘root’}, success:function(data){ } }) 建议:永远让服务器端返回一个字典
return HttpResponse(json,dumps(字典)) $.getJson $.post

 

posted @ 2017-12-26 21:04  xiekejian  阅读(241)  评论(0编辑  收藏  举报