笔记
一.创建Django工程:
1.django-admin startproject “name”
2.或pycharm创建
二.创建app处理相应业务:
- cd “project_name” ---->python manage.py startapp “app_name”
三.静态文件路径配置:
project–>settings.py
STATICFILES_DIRS=(
os.path.join(BASE_DIR , “static” )
)
四.模板路径配置
settings.py:
DIRS:
[os.path.join(BASE_DIR , ‘templates’) , ]
五.注释:
settings中:注释middlerware---->注释csrf那句
六.定义路由规则:
url.py—>urlpatterns=[
url(r’^hello/’, hello.printH), ]
七.定义视图函数
app下的views.py
def hello(request):
request.method
request.POST.get(’’,None) #获取post方式请求的数据
request.GET.get(’’,None) #获取get方式请求的数据
return HttpResponse(data) #文件操作
return render(request,"模板路径")
return redirect("/url路径")
八.模板渲染:
特殊的模板语言
-
def func(request):
return render(request,“index,html”,{‘current’:“drt”}){% for content in value%}
{{value.name}}
{% endfor %}{{ current }}--->drt--->返回给用户浏览器
2.if else
{% if 条件 %}
asd
{% if 条件 %}
{% endif %}
{% else %}
<a>asdsa</a>
{% endif %}
<a>sdasd</a>
1.Django请求生命周期
1.url对应关系匹配 -->执行视图函数 -->返回用户字符串
2.url对应关系匹配 -->执行视图函数 -->打开一个HTML文件,读取内容渲染 -->返回用户字符串
2.创建并运行django procject
django-admin startproject “project_name”
cd 进入”project_name“—>python manage.py startapp “app_name”
cd 项目中,python manage.py runserver (127.0.0.1:8000)
3.配置
3.1 模板路径
settings.py的TEMPLATES里加:
DIRS:
[os.path.join(BASE_DIR , 'templates') , ]
3.2 静态文件路径
project–>settings.py里加
STATICFILES_DIRS=(
os.path.join(BASE_DIR , "static" ),
)
3.注释csrf
settings中:注释middlerware---->注释csrf那句
4.编写程序
4.1 路径与视图关联:path和url
4.1.1 所需包和语句
4.2 视图的两种形式,fbv(基于函数的视图)与cbv(基于类的视图)
4.2.0 都需要引入视图所在文件
4.2.1 fbv
fbv—>function base view:就是def
/index/ -->func
app: views.py:
def func(request) request包含所有的请求数据
user_list = [
{'name': 'zhangsan', 'gender': 'man', 'age': '20'},
{'name': 'lisi', 'gender': 'man', 'age': '20'},
{'name': 'wangwu', 'gender': 'man', 'age': '20'},
{'name': 'zhaoliu', 'gender': 'woman', 'age': '20'},
{'name': 'drt', 'gender': 'man', 'age': '20'},
]
def backStage(request):
if request.method=="POST":
con_name=request.POST.get("name",None)
con_gender = request.POST.get("gender",None)
con_age = request.POST.get("age",None)
con={'name':con_name,'gender':con_gender,'age':con_age}
user_list.append(con)
return render(request, 'BackStageManagement.html',{'user_list':user_list})
#render函数是将html文件和传入的数据进行一个渲染,然后返回一个字符串然后返回到客户端的浏览器,传的值是字典或json形式,比如{'user_list':user_list}
urls
url(r'^BackStageManagement/',views.backStage), #这里文件名后有/,则form的method最后也应该有
4.2.2 cbv
cbv—>class base view:就是class
from django.views import View
class Home(View):
def get(self,request): #get请求执行这个方法,这里是小写
pass
def post(self,request): #post请求执行这个方法
pass
urls:
urlpatterns = [
path('admin/', admin.site.urls),
url(r'^home/',views.Home.as_view()),
]
4.2 定义路由规则:
url.py—>
urlpatterns=[
url(r'^hello/', hello.printH),
url(r'^detail-(\d+).html',views.detail),
url(r'^home/',views.Home.as_view()),
url(r'^detail-(?<nid>\d+)-(?<uid>\d+).html',views.detail),#这种是往views.detail里传多个参时候用的,且此时函数形参为nid和uid,但形参并无顺序之分
]
4.3 多个app的路由匹配:
1.首先最顶层的即项目的urls如下:
如果路径输入的是cmdb,则对应找到app01的urls.
2.因为创建的app是没有urls的,所以需要自己创建urls.py;然后app01和app02的urls里类似下图:
对应找到相应的app下的urls时,在根据路径后面的找到对应的函数执行.
3.输入的路径举例:
4.4 定义视图函数以及语法:
app下的viewas.py:
def hello(request):
函数主体
from django.shortcuts import HttpResponse
return Httpresponse("字符串")
from django.shortcuts import render
return render(request,'login.html',{"errors":errors}) #render的文件必须有后缀.html,且一个 / 都没有;内容会返回的是模板内容,地址栏中的地址不会改变,还是请求时候的
from django.shortcuts import redirect
return redirect('/BackStageManagement') #redirect url路径没有后缀;不仅内容返回的是里面的模板内容,地址栏中的地址也会改变为模板内容的路径
4.5 模板渲染:
html写的特殊的模板渲染语言
1.for
{% for content in value%}
{{value.name}}
{% endfor %}
<div> {{ current }} </div> ---> <div> drt </div> --->返回给用户浏览器
2.if else
{% if 条件 %}
<a>asd</a>
{% if 条件 %}
{% endif %}
{% else %}
<a>asdsa</a>
{% endif %}
<a>sdasd</a>
模板读数据:
1.假如传过来的数据格式如下:
userlist=[
{"name":"root","email":"root@email"},
{"name":"root","email":"root@email"},
{"name":"root","email":"root@email"},
]
那么模板里应该:
{% for i in userlist%} 这里i是每条字典
{{i.name}}
{{i.email}}
{% endfor %}
2.假如传过来的数据格式如下:
userlist={
"one":"root1",
"two":"root2",
"three":"root3",
}
那么模板应该是:
{{for i in userlist.keys}}
{{i}} #循环字典的key;若上句是.values,则循环的是value;items则输出的包含k-v的元组
{{endfor}}
{{for k,con in userlist.items}}
{{k}}{{con}} #k-v都被取出来
{{endfor}}
4.6 视图函数里用到的基本语法
4.6.1 获取客户端传的数据
1.request.method #获取客户端提交方式;提交数据一般是POST方式,直接访问是GET
2.request.POST.get(''",None) #获取post方式请求的数据
3.request.GET.get(''",None) #获取get方式请求的数据
4.html:
<lobel for="gender_man">男</lobel>
<input name="gender" type="radio" value="1">
<lobel for="gender_woman">女</lobel>
<input name="gender" type="radio" value="0">
视图:
request.GET.getlist("",None) #以列表存放获取到的值;并且可以获取到input的checkbox传来的多个或单个值
5.html:
<form action="/login/" method ="POST" enctype="multipart/form-data"> #enctype等于这个值才可以上传文件
<p><input type="file" name="commit_file"></p>
</form>
视图:
import os
file_com=request.FILES.get("commit_file")
file_path=os.path.join("upload",file_com.name)
print(type(file_com),file_com.name)# file_com.name 是上传的文件名
f=open(file_path,mode="wb") #在upload目录下以二进制写的方式打开(如果没有则创建)名为file_com.name的文件
for i in file_com.chunks(): #因为上传文件时是一点一点上传的,所以将上传的内容写入打开的文件时也是一点一点写的
f.write(i)
f.close()
4.7 点击打开另一个页面(涉及到页面跳转传参)
4.7.1 ?方式传参跳转:
要传的数据:
userlist={
"one":{"name":"root1","email":"root@email"},
"two":{"name":"root2","email":"root@email"},
"three":{"name":"root3","email":"root@email"},
}
urls:
url(r'^detail/',views.detail),
url(r'^show/',views.show),
views:
def show(request):
return render(request,"show.html",{"userlist":userlist})
def detail(request):
nid=request.GET.get("nid")
return render(request,"detail.html",{"userdetail":userlist[nid]})
html:
show.html:
{% for index,con in userlist.items %}
<a target="_blank" href="/detail/?nid={{index}}"><h3>{{ index }} 点击查看详情</h3></a>
{% endfor %}
detail.html:
<body>
详情页面:
<h3>{{ userdetail.name }} {{userdetail.email }}</h3>
</body>
大体流程:通过show函数渲染并打开show.html--->点击查看详情时通过nid传参,并在detail函数里接受,然后渲染并打开detail.html
4.7.2 正则表达式传参跳转:
要传的数据:
userlist={
"1":{"name":"root1","email":"root@email"},
"2":{"name":"root2","email":"root@email"},
"3":{"name":"root3","email":"root@email"},
}
urls:
url(r'^detail-(\d+).html',views.detail), 正则表达式\d+,可以匹配所有的detail-*,但要注意这里匹配字典的k引号里只能是数字
url(r'^show/',views.show),
views:
#url正则表达式跳转:
def detail(request,index): #这里第二个参数index的名字随便起
return render(request,"detail.html",{"userdetail":userlist[index]})
def show(request):
return render(request,"show.html",{"userlist":userlist})
html:
show.html:
<body>
测试a标签的href拼接,用于点击跳转
{% for index,con in userlist.items %}
<a target="_blank" href="/detail-{{index}}.html"><h3>{{ index }} 点击查看详情</h3></a>
{% endfor %}
</body>
detail.html:
<body>
详情页面:
<h3>{{ userdetail.name }} {{userdetail.email }}</h3>
</body>