一、Django表單(form)請求:
打開的時候默認是GET請求,獲取form表單的內容。
點提交的時候是POST請求,提交form表單的內容。
根據以上區別來編寫獲取表單內容:
from django.shortcuts import HttpResponse from django.shortcuts import render, redirect def login(request): # request包含用戶提交的所有信息。 error_msg = '' if request.method == 'POST': user = request.POST.get('user', None) //使用get方法獲取'user'鍵值,如果沒有user鍵,賦值None pwd = request.POST.get('pwd', None) //get方法裏的user和pwd是form表單裏input對象的name屬性。 if user == '123' and pwd == '123456': return redirect('http://www.baidu.com') else: error_msg = '用戶名或密碼錯誤' return render(request, 'login.html', {'error_msg':error_msg})
二、{{key}}
{{}}在html文件中指定key,通過views.py傳遞字典,html在客戶端顯示的是典對應的key值。
HTML
<span>{{error_msg}}<span>
三、HTML讀取字典數據和列表
字典:使用 . 讀取讀典key: dict_name.key
列表:使用 .索引讀取,list_name.0
views.py
def show(request): dict_name = {'name':'櫻', 'age':19, 'mail':'[email protected]', 'fav':['football', 'sing', 'cook']} return render(request,'home.html', dict_name)
字典HTML:
<p>{{dictname.name}}</p> \\櫻 <p>{{dictname.age}}</p> \\19 <p>{{dictname.mail}}</p> \\[email protected]
列表HTML
<p>{{list_name.0}}</p> \\football <p>{{list_name.1}}</p> \\sing <p>{{list_name.2}}</p> \\cook
四、HTML中for循環:
使用{%%}標記循環語句,並且使用{%endfor%}聲明循環結束
{%for k, v in dict_name%} \\HTML內容 <p>{{k}}:{{v}}</p> {%endfor%}
//views.py return render(request, 'index.html', {'list_name':['a','b','c']}) {%for i in list_name%} <p>{{i}}</p> //a,b,c {%endfor%}
五、HTML中if循環:
{%if 條件1 %} \\HTML內容 <p>{{k}}:{{v}}</p> {%elif 條件2%} ... {%else%} ... {%endfor%}
六、views.py獲取html模板傳入的數據
html提交的數據方法有很多種,一般使用兩類:POST和GET
1、POST方法請求:一般用於修改、更新數據。
2、GET方法請求:以網址顯示方式提交,例:http:\\localhost\hw\?id=1&name=david,一般用於向服務器請求數據
3、其它。put,delete,head,option....
4、上傳文件類型的數據,在Form表單指定-->enctype='multipart/form-data'
views.py獲取數據方法:
1、POST.get('name','默認值'),獲取元素的唯一值,如果沒有,賦默認值
2、POST.getlist('name','默認值'),獲取多值元素的列表,如果沒有,賦默認值
def get_data(request): get_post = request.POST.get('user_name') # 獲取HTML元素名爲user_name的值 ,<input name='user_name'> get_post = request.POST.get('user_name',None) # 找不到user_name元素,返回None get_list = request.POST.getlist('favor') # 獲取checkbox,multiple的HTML值 get_get = request.GET.get('user_name') # 同上 get_get = request.GET.get('user_name',None) # 同上 get_get = request.GET.getlist('user_name')
3、FILES.get('name'),獲取上傳的文件對象,默認顯示文件名,
obj.name顯示上傳的文件名,
obj.chunks()迭代器讀取數據塊,使用for循環讀取所有數據,for r in obj.chunks()
def get_file(request): obj = request.FILES.get('file_obj') f = open(obj.name, 'wb+') # 以上傳的文件名命名。 for i in obj.chunks(): # 循環讀取chunks迭代器數據。 f.write(i) f.close()
七、views.py函數返回網址:
1、render:HTML模板路徑,格式:render(request,'HTML模板名',傳遞的字典)
2、redirect:返回一個完整的URL ,格式:redirect('http://www.baidu.com')
3、HttpResponse:返回HTML的字符串,格式:HttpResponse('<p>這只是一個例子</p>')
def show_data(request): v=1234 # 站內跳轉 return render(request,'index.html',{"dict":v}) # 站外跳轉 return redirect('http://www.baidu.com') # 直接返回HTML字符串。 return HttpResponse('<p>警告!</p>')
上傳文件示例:
urls.py
from django.conf.urls import url from django.contrib import admin import index.views urlpatterns = [ url(r'^admin/', admin.site.urls), url( r'^mains$',index.views.mains), # http://ip/mians,跳轉到index目錄下的views.py下的mains函數 ## url( r'',index.views.mains), # http://ip,跳轉到index目錄下的views.py下的mains函數 url(r'^mains/up$', index.views.rev_file) # r'^ $'定義^開頭$結尾,否則,所有包含此單詞的地址都轉向,容易混淆 ]
index.html
使用了{{}},{%%},模板語言。同時上傳
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="up" enctype="multipart/form-data" method="post"> //action,跳轉到的網址,action="/up"代表 根目錄+up;action="up"代表 當前網址+up //enctype,form表單可接收文件 <input type="text" name="user_name" placeholder="Input your name..." /> <input name="up_file" type="file"/> //type="file",代表可以上傳文件型數據 <p> 文件分類: 軟件<input type="checkbox" value="技術" name="f_type"> HTML<input type="checkbox" value="HTML" name="f_type"> 編程<input type="checkbox" value="編程" name="f_type"> </p> //創建多選框 <input type="submit" value="提交"> </form> {% if f_name %} //使用if判斷是否上傳文件,上傳文件,顯示信息 <p><span style="font-style: italic">{{ u_name }}</span>,Your file:{{ f_name }} Upload Successful!</p> 分類: {% for i in f_type %} //使用for讀取選擇的文件分類 {{ i }} {% endfor %} {% else %} //未上傳文件提示 <p><span>You don't upload file!</span></p> {% endif %} </body> </html>
test/views.py
from django.shortcuts import render import os # Create your views here. def mains(request): # 首次打開網址,進入的index.html頁面 return render(request, 'index.html') def rev_file(request): # 接收form表單提交的數據 f_name = '' u_name = '' f_type = '' if request.method == 'POST': f_obj = request.FILES.get('up_file', None) # 獲取file對象,print(f_obj)是文件名,但實際是對象,因爲FILES定義了__repr__或__str__ if f_obj: #如果有上傳的文件 f_name = f_obj.name u_name = request.POST.get('user_name', None) f_type = request.POST.getlist('f_type') #獲取checkbox或multiple類型的option選項的數據 f = open(os.path.join('upload', f_name), 'wb+') #manage.py同級目錄的upload文件夾 for i in f_obj.chunks(): #chunks(),迭代器,使用for讀取 f.write(i) f.close() return render(request, 'index.html', {'f_name': f_name, 'u_name': u_name, 'f_type': f_type}) # 再返回index.html的內容,但瀏覽器網址會變,內容也會出現if語句的內容