表单(forms)

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm=1001.2014.3001.5501

在app1文件夹下创建一个forms.py文件,添加如下类代码:

from django import forms

class PersonForm(forms.Form):

first_name = forms.CharField(label='你的名字', max_length=20)

last_name = forms.CharField(label='你的姓氏', max_length=20)

上面定义了一个PersonForm表单类,两个字段类型为forms.CharField,类似于models.CharField,first_name指字段的label为你的名字,并且指定该字段最大长度为20个字符。max_length参数可以指定forms.CharField的验证长度。

PersonForm类将呈现为下面的html代码:

<label for="你的名字">你的名字: </label>

<input id="first_name" type="text" name="first_name" maxlength="20" required />

<label for="你的姓氏">你的姓氏: </label>

<input id="last_name" type="text" name="last_name" maxlength="20" required />

表单类forms.Form有一个is_valid()方法,可以在views.py中验证提交的表单是否符合规则。对于提交的内容,在views.py编写如下代码:

from django.shortcuts import render

from django.http import HttpResponse, HttpResponseRedirect

from app1.forms import PersonForm

def get_name(request):

判断请求方法是否为POST

if request.method == 'POST':

将请求数据填充到PersonForm实例中

form = PersonForm(request.POST)

判断form是否为有效表单

if form.is_valid():

使用form.cleaned_data获取请求的数据

first_name = form.cleaned_data'first_name'

last_name = form.cleaned_data'last_name'

响应拼接后的字符串

return HttpResponse(first_name + '' + last_name)

else:

return HttpResponseRedirect('/error/')

请求为GET方法

else:

return render(request, 'name.html', {'form': PersonForm()})

在html文件中使用返回的表单的代码如下:

<form action="/app1/get_name" method="post">

{% csrf_token %}

{{ form }}

<button type="submit">提交</button>

</form>

{{form}}是Django模板的语法,用来获取页面返回的数据,这个数据是一个PersonForm实例,所以Django就按照规则渲染表单。

注意:渲染的表单只是表单的字段如上面PersonForm呈现的HTML代码,所以我们要在HTML中手动输入"<form></form>"标签,并指出需要提交的路由"/app1/get_name"和请求的方法post。并且,<form>标签的后面需要加上Django的防止跨站请求伪造模板标签{% csrf_token %}。简单的一个标签,就很好地解决了form表单提交出现跨站请求伪造攻击的情况。

添加URL到创建的app1/urls.py中,代码如下:

path('get_name', app1_views.get_name)

此时访问页面"http://127.0.0.1:8000/app1/get_name",效果如图26所示。

图26 在Django项目中创建表单

相关推荐
段一凡-华北理工大学5 分钟前
工业智能体:从Codex/Claude到项目实战~系列文章05:从“AI助手“到“工业智能体“:能力跃迁与落地范式
人工智能·python·claude·codex·工业智能体·高炉炼铁智能化
深蓝AI28 分钟前
ContextVar 到线程池就丢了?asyncio.to_thread 和 run_in_executor 实测
python
岁月宁静2 小时前
什么是 Agent:从"会聊天"到"会做事"
人工智能·python
Nturmoils2 小时前
集中式与分布式怎么选:从订单读写看 KingbaseES 的架构边界
数据库
岁月宁静2 小时前
AI 应用开发工程师简历怎么写:HR 初筛、技术复筛、面试追问,三道关卡各看什么?
人工智能·python·面试
xiaomuzuirenzhen2 小时前
大专电子商务从事电商运营分析师需要考证吗?
大数据·数据库
来让爷抱一个2 小时前
Python 异步里混用同步库,事件循环被卡住的全过程
开发语言·python
小肝一下4 小时前
3.基础语法(3)
python
翔云1234564 小时前
RocksDB中,客户端每写入一次数据,需要访问几次磁盘
运维·数据库·mysql
DevOpenClub4 小时前
职教高考控制线 API:招生类别枚举、筛选与空分数含义
java·数据库·高考