python_Django

这篇博客详细介绍了Django项目的创建和运行过程,包括请求生命周期、配置如模板和静态文件路径设置、注释CSRF、路由规则定义、视图函数(FBV和CBV)以及模板渲染。此外,还涵盖了页面跳转、参数传递和Django的ORM基本操作。
摘要由CSDN通过智能技术生成

笔记

一.创建Django工程:
1.django-admin startproject “name”
2.或pycharm创建
二.创建app处理相应业务:

  1. 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路径")

八.模板渲染:
特殊的模板语言

  1. 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
如果路径输入的是cmdb,则对应找到app01的urls.

2.因为创建的app是没有urls的,所以需要自己创建urls.py;然后app01和app02的urls里类似下图:
对应找到相应的app下的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>

5.django的ORM基本操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值