get與post參數
get與post傳參可以通過前端頁面method控制,當method為get時就是通過get傳參,當method為post的時就是通過post form表單傳遞參數
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 <h1>登錄</h1> 9 <form action="" method="post"> 10 {% csrf_token %} 11 <p>用戶名:<input type="text" name="username"></p> 12 <p>密碼:<input type="password" name="password"></p> 13 <p><input type="submit" value="登錄"></p> 14 </form> 15 </body> 16 </html>
get傳參效果
post傳參效果,主要時通過form表單傳遞
前后台數據交互及登陸小案例
前端登陸頁面login.html
1 <body> 2 <h1>登錄</h1> 3 <form action="" method="post"> 4 {% csrf_token %} 5 <p>用戶名:<input type="text" name="username"></p> 6 <p>密碼:<input type="password" name="password"></p> 7 <p><input type="submit" value="登錄"></p> 8 </form> 9 </body> 10 </html>
后端views頁面,需要判斷method然后根據提交的參數判斷是否跳轉到index頁面
1 def login(request): 2 # url = reverse('teacher:detail', kwargs={'pk': 12}) 3 # return redirect(url) # 硬編碼 4 if request.method == "POST": 5 username = request.POST.get('username','') 6 password = request.POST.get('password','') 7 if username =='xinlan' and password =='123456': 8 return redirect(reverse('teacher:index')) 9 return render(request, 'teacher/login.html')
出現一鍵多值的情況的時候,需要用request.GET.getlist()
文件上傳:
1.設置上傳路徑:
setting里面設置UPLOAD__ROOT
STATIC_URL = '/static/' STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')] UPLOAD_ROOT = os.path.join(BASE_DIR,'upload')
2.上傳前端頁面upload.html
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 <h1>上傳文件</h1> 9 <form action=""method="post" enctype="multipart/form-data"> 10 <p>請選擇你要上傳的文件: <input type="file" name="file"></p> 11 <p><input type="submit" value="上傳"></p> 12 </form> 13 14 </body> 15 </html>
3.后端設置
需要設置views.py和urls路由等
views
def upload(request ):
if request.method == 'POST':
file = request.FILES.get('file',None)
if file:
day_dir = datetime.now().strftime('%Y%m%d')
pre_dir = os.path.join(UPLOAD_ROOT,day_dir)
if not os.path.exists(pre_dir):
os.mkdir(pre_dir)
filename=os.path.join(pre_dir,file.name)
with open(filename,'wb') as f:
for line in file.chunks():
f.write(line)
return HttpResponse('上傳成功')
else:
return render(request,'teacher/upload.html')
urls
urlpatterns = [ path('index/', views.index, name='index'), path('login/', views.login), path('detail/<int:pk>/', views.detail, name='detail'), # path('students/<int:year>/<int:month>/', views.students), re_path(r'students/(?P<year>\d{4})/(?P<month>[0-9]|1[0-2])/', views.students), path('upload/', views.upload,name='upload'), ]
多文件上傳:
前端upload頁面需要加multiple
1 <h1>上傳文件</h1> 2 <form action=""method="post" enctype="multipart/form-data"> 3 <p>請選擇你要上傳的文件: <input type="file" name="file" multiple></p> 4 <p><input type="submit" value="上傳"></p> 5 {% csrf_token %} 6 </form>
后端views需要通過getlist來獲取多個文件,然后通過for循環分別上傳
1 def upload(request): 2 if request.method == 'POST': 3 files = request.FILES.getlist('file', None) 4 for file in files: 5 day_dir = datetime.now().strftime('%Y%m%d') 6 pre_dir = os.path.join(UPLOAD_ROOT, day_dir) 7 if not os.path.exists(pre_dir): 8 os.mkdir(pre_dir) 9 filename = os.path.join(pre_dir, file.name) 10 with open(filename, 'wb') as f: 11 for line in file.chunks(): 12 f.write(line) 13 return HttpResponse('上傳成功!') 14 15 return render(request, 'teacher/upload.html')