2021-08-06-DJ-035 Django的表单类Form实现留言的功能,模型表单类的使用,自定义模型表单类的验证规则

这一篇讲Django中的表单类Form
官方文档
Django表单系统的核心组件是 Form 类。它与Django模型描述对象的逻辑结构、行为以及它呈现给我们内容的形式的方式大致相同, Form 类描述一张表单并决定它如何工作及呈现。

类似于模型类的字段映射到数据库字段的方式,表单类的字段会映射到HTML表单的 元素。 ModelForm 通过 Form 映射模型类的字段到HTML表单的 元素,Django admin就基于此。

表单字段本身也是类;他们管理表单数据并在提交表单时执行验证。 DateField 和 FileField 处理的数据类型差别很大,所以必须用来处理不同的字段。

在浏览器中,表单字段以HTML“控件”(用户界面的一个片段)的形式展现给我们。每个字段类型都有与之相匹配的 控件类 ,但必要时可以覆盖。
这节做完的源代码

基础表单

为显示效果,这里还以发邮件为例
在一个app里面写一个forms.py

from django import forms

class NameForm(forms.Form):
    your_name = forms.CharField(label='称谓', max_length=100)
    contact = forms.CharField(max_length=11,label='手机号')
    message = forms.CharField(widget=forms.Textarea,label='留言')

写一个视图函数formtest
这里还没有实现主要功能

from django.http import HttpResponseRedirect, HttpResponse
from django.shortcuts import render

from .forms import NameForm

def formtest(request):
    # if this is a POST request we need to process the form data
    if request.method == 'POST':
        # create a form instance and populate it with data from the request:
        form = NameForm(request.POST)
        # check whether it's valid:
        if form.is_valid():
            # process the data in form.cleaned_data as required
            # ...
            # redirect to a new URL:
            return HttpResponse('<发送成功>')

    # if a GET (or any other method) we'll create a blank form
    else:
        form = NameForm()

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

做一个模板mainapp/name.html
表单类的模板需要自己加form标签

{% extends 'index.html' %}
{% block title %}
表单示例
{% endblock %}
{% block content %}
<form action="/main/formtest" method="post" class="form form-control-plaintext">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="提交">
</form>

{% endblock %}

显示效果
在这里插入图片描述
不要忘记,一张表单的输出 不 包含外层 标签以及 submit 控件。这些必须由你自己提供。
对于

{{ form.as_table }} will render them as table cells wrapped in tags
{{ form.as_p }} will render them wrapped in

tags
{{ form.as_ul }} will render them wrapped in

  • tags
    注意,您必须自己提供外层的 或
    • 元素。
      使用.as_p,看上去效果好很多
      在这里插入图片描述
      调整模板内容,至少好看点
      重排字段的话参照官方文档这里
      在这里插入图片描述
      给我们的视图函数加上发邮件功能
  • 在判断成功的情况下取干净的数

           if form.is_valid():
                # process the data in form.cleaned_data as required
                #发邮箱
                your_name=form.cleaned_data['your_name']
                contact=form.cleaned_data['contact']
                message=form.cleaned_data['message']
    
                loginsource=request.META['REMOTE_ADDR']
                mmessage='-->'.join([loginsource,your_name,contact,message])
                subject='表单测试'
                from django.core.mail import send_mail
                send_mail(subject=subject,message=mmessage,recipient_list=['1015@qq.com'],from_email=None)
    
                # redirect to a new URL:
                return HttpResponse('<发送成功>')
    

    结果就能收到啦

    在这里插入图片描述
    邮箱的密码会过期的,所以过期的话再重新申请一个
    在这里插入图片描述

    这个是没有做clean的情况,会莫名找不到属性
    在这里插入图片描述

    模型表单

    定义模型表单类

    class UserForm(forms.ModelForm):
        class Meta:
            model = UserModel
            fields='__all__'
            error_messages={
                'name':{
                    'required':'这是用户必填项',
                    'max_length':'最长不超过20字符数'
                },
                'age':{
                    'required':'这是用户必填项',
                },
                'number':{
                    'max_length':'手机号不得超过11位'
                }
            }
    
    
    

    model指的是模型
    fields指的是字段,一般是列表,all指的是全部字段
    其他的属性==》
    排除的字段: exclude =
    调整默认组件 : widgets = { ‘name’: Textarea(attrs={‘cols’: 80, ‘rows’: 20}), }
    更改标签: labels = { ‘name’: _(‘Writer’), }
    帮助信息 : help_texts = { ‘name’: _(‘Some useful help text.’), }
    如果您想指定一个字段的验证器,可以通过声明定义该字段并设置其 validators 参数来实现:
    slug = CharField(validators=[validate_slug])

    涉及到字段的信息及验证可以通过声明定义该字段并设置相应名字的参数,与基础的表单类使用基本一致

    在 admin相应的用户管理器中增加属性

        form = UserForm
    
    

    此时的这里的 field可以被注释掉,但不注释掉也可以,当做排序字段

    这是没加之前的 ,提示是:该字段是必填项
    在这里插入图片描述
    加了以后还有field的:已经提示是 这是用户必填项
    在这里插入图片描述

    没有field的时候会按照表单类的顺序排,然后表单类里面直接用的all,所以是按照模型里面字段出现的顺序排。
    在这里插入图片描述

    自定义手机号的验证规则

    还是手机号的规则
    在表单类里面加上这个函数

        def clean_number(self):
                number=self.cleaned_data.get('number')
                if  re.match(r'1[1-57-9][0-9]{9}', number):
                    print(number)
                    return number
                raise ValidationError("表单验证,手机号格式不正确")
    

    在这里插入图片描述

    在这里插入图片描述
    合理值就会保存,不合理的就会提示错误。
    这个覆盖了原来在字段里设置的手机号验证

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Amoor123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值