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():
    
        
        
        
        
        
        
        
        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文件中示例代码如下:


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():
    
        user = form.save(commit=False)
        print(type(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请求提交数据
123.ModelForm的使用_第1张图片
在数据库中进行查看,数据已经添加到数据库中了:

123.ModelForm的使用_第2张图片

你可能感兴趣的:(123.ModelForm的使用)