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