表单<form>...</form>
可以收集其内部标签中的用户输入,然后将数据发送到服务端。
一个HTML表单必须指定两样东西:
目的地:用户数据发送的目的URL
方式:发送数据所使用的HTTP方法
form元素内部还定义了一个说明标签<label>和一个发送按钮‘submit’,以及最关键的接收用户输入的<input>元素。
例如,Django Admin站点的登录表单包含几个<input>元素:type="text"用于用户名,type="password"用于密码,type="submit"用于“登录"按钮。它还包含一些用户看不到的隐藏的文本字段,Django 使用它们来提高安全性和决定下一步的行为。
它还告诉浏览器表单数据应该发往<form>的action属性指定的URL:/admin/,而且应该使用method属性指定的HTTP post方法发送数据。
当点击<input type="submit" value="Log in">元素时,数据将发送给/admin/
处理表单时候只会用到POST和GET方法。
GET方法将用户数据以键=值的形式,以‘&’符号组合在一起成为一个整体字符串,最后添加前缀“?”,将字符串拼接到url内,生成一个类似https://docs.djangoproject.com/search/?q=forms&release=1的URL
以最简单的GET-POST请求为例:
views.py
from django.http import HttpResponse
from django.shortcuts import render
# 表单
def search_form(request):
return render(request, 'search_form.html')
# 接收POST请求数据
def search_post(request):
ctx = {}
print(request, request.POST['q'])
if request.POST:
ctx['rlt'] = request.POST['q']
return render(request, "search_post.html", ctx)
# 接收GET请求数据
def search(request):
request.encoding = 'utf-8'
print(request)
if 'q' in request.GET and request.GET['q']:
message = '你搜索的内容为: ' + request.GET['q']
else:
message = '你提交了空表单'
return HttpResponse(message)
search_from.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>search_form</title>
</head>
<body>
<form action="/search/" method="get">
<input type="text" name="q">
<input type="submit" value="搜索">
</form>
</body>
</html>
search_post.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>search_post</title>
</head>
<body>
<form action="/search-post/" method="post">
{% csrf_token %}
<input type="text" name="q">
<input type="submit" value="搜索">
</form>
<p>{{ rlt }}</p>
</body>
</html>
urls.py
from django.urls import path
from . import views
urlpatterns = [
path('search-form/', views.search_form),
path('search/', views.search),
path('search-post/', views.search_post),
]
在search_form.html 中action=“/search/” method=“get”,指定用GET方法将数据发送到/search
因此在http://127.0.0.1:8000/search-form/
输入abc回车,则会跳转到http://127.0.0.1:8000/search/?q=abc
并回显
你搜索的内容为:abc
在search_post.html 中action=“/search-post/” method=“post”,指定用POST方法将数据发送到/search-post
因此在http://127.0.0.1:8000/search-post/
输入abc回车,则会在本页面回显信息
Django的表单中的HTML字段有以下几种:
<form action="/your-name/" method="post"> 这一行定义了我们的发送目的地/your-name/和HTTP方法POST
<input type="submit" value="搜索">
<input type="text">: 这个字段用于输入单行文本信息,例如用户名、密码等。
<input type="password">: 这个字段用于输入密码信息,会隐藏所输入的文本。
<input type="email">: 这个字段用于输入电子邮件地址。
<input type="url">: 这个字段用于输入网址。
<input type="checkbox">: 这个字段用于选择一个或多个选项,例如勾选协议同意框等。
<input type="radio">: 这个字段用于从多个选项中选择一个选项。
<input type="file">: 这个字段用于上传文件。
<input type="hidden">: 这个字段用于隐藏数据,例如存储一些需要在表单提交时携带的数据,但用户不需要看到这些数据。
此外,还有一些HTML字段是Django自定义的,例如:
CharField: 这个字段用于输入单行文本信息。
EmailField: 这个字段用于输入电子邮件地址。
IntegerField: 这个字段用于输入整数。
FloatField: 这个字段用于输入浮点数。
BooleanField: 这个字段用于选择是或否。
DateField: 这个字段用于输入日期。
DateTimeField: 这个字段用于输入日期和时间。
这些Django自定义的HTML字段可以在Django表单中使用。