表单提交
在HTML中,form表单的作用是收集标签中的内容,<form>...</form> 中间可以由访问者添加类似于文本,选择,或者一些控制模块等等.然后这些内容将会被送到服务端。
一个表单必须指定两样东西:
- form的method参数用于设置表单的提交方式,默认使用POST. 注意需加 {% csrf_token %}
- action用于设置表单的提交url,如果不写或者保持空字符串,那么将使用当前的URL.
<form action="" method="post">
{% csrf_token %}
<p>用户名:<input type="text" name="username" placeholder="请输入用户名"></p>
<p>密码:<input type="password" name="password" placeholder="请输入密码"></p>
<p><input type="submit" value="登陆"></p>
</form>
- GET 方式获取参数
- get提交的参数会在url中显示.
{#前端代码#}
<h1>登陆</h1>
<form action="" method="post">
{% csrf_token %}
<p>用户名:<input type="text" name="username" placeholder="请输入用户名"></p>
<p>密码:<input type="password" name="password" placeholder="请输入密码"></p>
<p><input type="submit" value="登陆"></p>
</form>

- 可以通过request.GET.get的方法来获取提交的参数.
# views.py
class Login(View):
def get(self, request):
username = request.GET.get('username', '')
password = request.GET.get('password', '')
print('用户名:{} 密码:{}'.format(username,password))
return HttpResponse('登陆成功')
# urls.py
from django.urls import path, re_path
from . import views
app_name = 'index'
urlpatterns = [
path('home/', views.Index.as_view(), name='home'),
path('login/', views.Login.as_view(), name='login'),
]
# 后台数据返回
用户名:liuwei 密码:123456
[08/Mar/2019 11:18:54] "GET /login/?username=liuwei&password=123456 HTTP/1.1" 200 12
- POST 方式获取参数
- post提交的参数,会通过body参数传递给服务器
{#前端代码#}
<h1>登陆</h1>
<form action="" method="post">
{% csrf_token %}
<p>用户名:<input type="text" name="username" placeholder="请输入用户名"></p>
<p>密码:<input type="password" name="password" placeholder="请输入密码"></p>
<p><input type="submit" value="登陆"></p>
</form>

- 可以通过request.POST.get的方法来获取提交的参数.
# views.py
class Login(View):
def get(self, request):
return render(request, 'login/login.html')
def post(self, request):
username = request.POST.get('username', '')
password = request.POST.get('password', '')
print('用户名:{} 密码:{}'.format(username, password))
return HttpResponse('登陆成功')
# urls.py
from django.urls import path, re_path
from . import views
app_name = 'index'
urlpatterns = [
path('home/', views.Index.as_view(), name='home'),
path('login/', views.Login.as_view(), name='login'),
]
# 后台数据返回
用户名:liuwei 密码:123456789q
[08/Mar/2019 11:24:20] "POST /login/ HTTP/1.1" 200 12
- 一键多值的getlist方法:
request对象的属性GET、POST都是QueryDict类型的对象,与python字典不同,QueryDict类型的对象用来处理同一个键带有多个值的情况- 方法get():
根据键获取值,只能获取键的一个值
如果一个键同时拥有多个值,获取最后一值 - 方法getlist():
根据键获取值将键的值以列表返回
可以获取一个键的多个值 - 举例:
- 方法get():
<p>用户名:<input type="text" name="username" placeholder="请输入用户名"></p>
<p>用户名:<input type="text" name="username" placeholder="请输入用户名"></p>
username = request.POST.getlist('username', '')
print('用户名:{} '.format(username))
# 后台返回信息
用户名:['liuwei', 'weige']
文件上传
Django在处理文件上传的时候,文件数据被保存在了request.FILES
FILES中的每个键为<input type="file" name="" />中的name
- 设置文件的存储路径
# 1.在项目根目录下files文件夹
# 2.图片上传后,会被保存到“/files/文件”
# 3.打开settings.py文件,增加FILES_ROOT项
FILES_ROOT = os.path.join(BASE_DIR, 'files')
- FILES只有在请求的方法为POST 且提交的<form>带有enctype="multipart/form-data" 的情况下才会包含数据。否则,FILES 将为一个空的类似于字典的对象
{#前端代码#}
<h1>上传文件</h1>
<form action="" method="post" enctype="multipart/form-data" >
{% csrf_token %}
{# multiple 允许多个文件上传 #}
<input type="file" name="file" multiple>
<p><input type="submit" value="上传" ></p>
</form>
# views.py
class UpLoadFiles(View):
def get(self, request):
return render(request, 'login/login.html')
def post(self, request):
files = request.FILES.getlist('file', None)
day_dir = datetime.now().strftime('%Y%m%d')
pre_dir = os.path.join(FILES_ROOT, day_dir)
if not os.path.exists(pre_dir):
# 要判断是否有权限创建该文件夹
os.mkdir(pre_dir)
for file in files:
file_name = os.path.join(pre_dir, file.name)
with open(file_name,'wb') as f:
# 数据流传输数据
for line in file.chunks():
f.write(line)
return HttpResponse('上传成功')
# urls.py
from django.urls import path
from . import views
app_name = 'index'
urlpatterns = [
path('upload/', views.UpLoadFiles.as_view(), name='upload'),
]
-
展示
image.png
网友评论