Django框架(九:自定义form表单,及get强求和post请求的区分)

本文详细介绍如何在Django中创建自定义表单,包括在forms.py中声明form类、定制input标签、处理GET和POST请求,以及在index.html中渲染自定义表单的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

步骤:

  1. 先在app下创建一个forms.py文件,文件名是固定的,并在这个文件中声明一个form类。
from django  import forms
class CustomForm(forms.Form):
  1. 定制input标签,声明相关字段类型
# IntegerField()用来表明输入框值的类型。
    # label参数对应的就是<label for="a">数字a:</label>
    # widget表示控件,input就是一个控件。如果默认控件提供的功能不够用,那么可以重新定制控件。比如input控件默认没有显示placeholder。
    # xxxField()和xxxInput()两者进行区分:
    # xxxField()决定了输入框中能输入的数据类型。
    # 而xxxInput()一般和xxxField()是对应的,它xxxInput()一般是用来重写控件的属性。
    a = forms.IntegerField(label='数字A', widget=forms.TextInput(attrs={'placeholder': '请输入数字', 'class': 'number'}))

    # required表示该输入框的值是否是必须填写的,默认为True。
    b = forms.IntegerField(label='数字B', required=False)
  1. 在views.py中,使用CustomForm类渲染表单
    当加载首页index.html的时候,不在使用默认的form表单了,需要将CustomForm这个定制的表单,渲染到index.html中
from .forms import CustomForm
def index(request):
    form = CustomForm()
    return render(request, 'index.html', {'form': form})

如何处理get请求和post请求

def form(request):
    """
    计算<form>表单中a和b相加之后的值。
    :param request:
    :return:
    """
    if request.method == "GET":
        # 此时的url地址:/form/?a=1&b=1
        # 获取form表单的GET请求的参数
        a = request.GET.get('a', 0)
        b = request.GET.get('b', 0)
        return HttpResponse('结果:{}'.format(int(a) + int(b)))
    elif request.method == "POST":
        # 如果表单(CustomForm)提交的是POST请求,如何获取POST请求的参数?
        # 两种方式:1.request.POST.get(); 2.使用is_valid和cleaned_data[];
        # print(request.POST.get('a'))
        # 根据POST请求的数据,初始化CustomForm类的对象
        form = CustomForm(data=request.POST)
        if form.is_valid():
            a = form.cleaned_data['a']
            b = form.cleaned_data['b']
            return HttpResponse(a+b)
        else:
            # 如果数据不合法,将错误的信息展示到页面上。
            # 此时的form对象中,携带异常信息的form。
            return render(request, 'index.html', {'form': form})
            # return HttpResponse('数据不合法')

cleaned_data: 如果CustomForm表单数据是合法的,那么input标签中的值,都会被放入cleaned_data这个字典中,如果CustomForm表单数据是不合法的,那么cleaned_data字典就不存在。
注意:在使用cleaned_data之前,一定要通过is_valid()判断数据的合法性。否则cleaned_data这个字典就是不存在的。只有通过is_valid()验证之后,才会生成这个cleaned_data字典。

在index.htm``l文件中进行渲染
csrf_token:主要是为了防止一些跨站请求伪造攻击, 每次在刷新页面的时候,Django的csrf中间件会动态生成一个隐藏的input标签,它的value是一个随机字符串,加载到页面源代码中,同时Django框架会将这一次生成的随机字符串保存在自己的数据库中。等form发送POST请求时,除了表单数据外,浏览器会自动将这个隐藏的input标签的值也携带上,提交给Django后台,Django的中间件就会对这个加密的随机字符串和数据库中的进行对比,如果一致,说明是正常的请求,如果不一致,Django就会出现403拒绝请求的页面,认为是一个非法的请求。

{# 如何渲染自定义的表单CustomForm? #}
        {# 1. <form>标签和<button type="submit">需要自己去设置; #}
        {# 2. 自定义表单只生成input标签; #}
        <form action="{% url 'form' %}" method="get">
            {{ form }}
            <button type="submit">计算</button>
        </form>
        <form action="{% url 'form' %}" method="post">
            {% csrf_token %}
            {{ form }}
            <button type="submit">计算</button>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值