• 123.ModelForm的使用


    ModelForm

    在我们的实例中,需要通过models.py中定义相关的模型字段,之后在forms.py中同样需要定义每个字段进行相应的验证,这样的话,我们会需要重复定义,这样的话,就相对比较麻烦,所以为了简化我们的操作。我们可以使用ModelForm,将二者进行结合。

    1.models.py文件中示例代码如下:

    from django.db import models
    from django.core import validators
    
    
    class User(models.Model):
        username = models.CharField(max_length=100)
        password = models.CharField(max_length=24)
        telephone = models.CharField(max_length=11, validators=[validators.RegexValidator(r"1[345678]d{9}")])
    
        class Meta:
            db_table = 'user'
    

    2.forms.py文件中直接指定model 这个属性的值,并且指定fields="all",就可以将model模型中的所有字段都复制过来,可以在提交表单的时候进行验证,示例代码如下:

    from django import forms
    from .models import User
    
    
    class UserForm(forms.ModelForm):
        class Meta:
            model = User
            # field可以指定在进行表单验证的时候,该模型中定义的字段中有哪个字段参数了验证
            # “__all__:方法可以指定该模型中所有的字段都需要进行验证”
            # 同样,也可以使用列表指定模型中的一部分字段参与验证,
            # 如果参与验证的字段比较多,而不参与验证的字段比较少的话,就可以使用exclude进行排除不参与验证的字段
            fields = '__all__'
            # field = ['username','telephone']
            # exclude = ['price']
    
            <!--定义各个字段错误信息-->
            error_messages = {
                'username': {
                    'invalid':'输入的用户名无效',
                    'required': '请输入用户名',
                    'max_length': '最大长度不能超过100',
                },
                'password': {
                    'invalid': '输入的密码不符合要求',
                    'required': '请输入密码',
    
                },
                'telephone': {
                    'invalid': '输入的手机号无效',
                    'required': '输入手机号',
                },
            }
    

    3.在views.py文件中定义视图函数(在这里只是定义采用POST请求向数据库提交数据,如果提交的数据合法,就会保存到数据库中,如果不合法,就会打印出相关的错误信息),示例代码如下:

    from django.shortcuts import render
    from django.http import HttpResponse
    from .models import User
    from .forms import UserForm
    
    
    # 采用POST请求访问User表,进行提交数据
    def user_view(request):
        <!--实例化对象-->
        form = UserForm(request.POST)
        <!--判断对象的各个字段是否满足要求,如果满足要求的话,就提取出所有的字段的值-->
        if form.is_valid():
        <!--1.提取数据,并进行保存到数据库中-->
            <!--username = form.cleaned_data.get('username')-->
            <!--password = form.cleaned_data.get('password')-->
            <!--telephone = form.cleaned_data.get('telephone')-->
            <!--将提取出的数据保存到数据库中-->
            <!--User.objects.create(username=username, password=password, telephone=telephone)-->
            
            <!--2.以上提取数据,并且进行保存的方式比较繁杂,。因此如果我们在使用form表单进行验证的时候,如果验证了复制的模型的所有字段值的合法性,就可以直接通过form.save()进行提取所有使用POST请求传送过来的数据,并且进行保存到数据库中-->
            form.save()
            return HttpResponse('success')
        else:
            <!--打印出相关的错误信息-->
            print(form.errors.get_json_data())
            return HttpResponse('FAIL')
    
    在Postman中可以采用POST请求提交相关字段的信息,同样可以保存到数据库中。

    在我们注册的时候我们需要,传入username,pwd1(密码),pwd2(确认密码),telephone,而在我们的模型User中只有username,password,telephone,所以在我们的数据库中只需要存储username,password,telephone就可以了。但是在我们的views.py文件中我们还想要直接使用form.save()进行提取数据和保存到数据库中,应该怎么操作呢???

    views.py文件中示例代码如下:

    <!--导入装饰器required_POST-->
    from django.views.decorators.http import required_POST
    
    # 使用装饰器required_POST,定义只能使用POST请求访问该视图
    @require_POST
    def register_view(request):
        form = registerForm(request.POST)
        if form.is_valid():
        <!--在使用save()方法进行提取和保存数据的时候,可以指定一个参数commit=False,就会生成一个user模型,但是并不会将所有的数据添加到数据库中进行保存。-->
            user = form.save(commit=False)
            print(type(user))
            <!--<class 'Modelform.models.User'>-->
            <!--之后就可以为模型的其他属性添加相应的值了-->
            user.password = form.cleaned_data.get('pwd1')
            user.save()
            return HttpResponse('success')
        else:
        <!--调用定义好的简化提取错误信息的函数-->
            print(form.get_errors())
            return HttpResponse('Fail')
    
    同时要在forms.py文件中添加以下代码:
    # 注意这里一定要是继承forms.ModelForm
    class registerForm(forms.ModelForm):
        # 重写两个字段进行验证
        pwd1 = forms.CharField(max_length=24, min_length=6)
        pwd2 = forms.CharField(max_length=24, min_length=6)
    
        class Meta:
            model = User
            fields = ['username','telephone']
    
        def get_errors(self):
            new_errors = {}
            errors = self.errors.get_json_data()
            for key,message_dicts in errors.items():
                messages = []
                for message_dict in message_dicts:
                    message = message_dict['message']
                    messages.append(message)
                new_errors[key] = messages
            return new_errors
    
        def clean(self):
            clean_data = super().clean()
            pwd1 = clean_data.get('pwd1')
            pwd2 = clean_data.get('pwd2')
            # 判断两次输入的密码是否一致
            if pwd1 != pwd2:
                raise forms.ValidationError('两次密码输入不一致!')
            return clean_data
    

    在Postman中采用POST请求提交数据
    在这里插入图片描述
    在数据库中进行查看,数据已经添加到数据库中了:

    在这里插入图片描述

    始于才华,忠于颜值;每件事情在成功之前,看起来都是天方夜谭。一无所有,就是无所不能。
  • 相关阅读:
    互联网常用网络基础命令
    使用idea搭建SpringBoot + jsp的简单web项目
    spring boot + mybatis + layui + shiro后台权限管理系统
    springboot-manager
    python中pip 安装、升级、升级固定的包
    管理后台快速开发脚手架 pyadmin
    Mac 基于Python搭建Django应用框架
    基于Python搭建Django后台管理系统
    python3 django layui后台管理开源框架分享(码云)
    轻量级办公平台Sandbox
  • 原文地址:https://www.cnblogs.com/guyan-2020/p/12310570.html
Copyright © 2020-2023  润新知