ModelForm用法讲解 save方法调用

模型表单:

首先我们在在定义一个模型类:

from django.db import models
from django.core import validators
# Create your models here.
class Book(models.Model):
    title = models.CharField(max_length=100)
    page = models.IntegerField()
    price = models.FloatField(validators=validators.MaxLengthValidator(limit_value =1000))

class User(models.Model):
    username = models.CharField(max_length=100)
    password = models.CharField(max_length=16)
    telephone = models.CharField(max_length=11)

然后在form文件里写 ,还可以自己定义错误信息在error_messages里写

from django import forms
from .models import Book
class AddBookForm(forms.ModelForm):   #ModelForm和Form用法一样   只不过能从模型中继承他的用法
    def clean_page(self):
        page = self.cleaned_data.get('page')
        if page > 100:
            raise forms.ValidationError('价格不能大于100')
        return page
    class Meta:
        model = Book
        #  fields 和exclude 必须要定义一个
        # fields = '__all__'   #Book模型上得所有字段我们都可以继承得到
        # fields = ['title','page']  #只验证title和page  价格可以不用写
        exclude = ['price']  #除了price 和field=['title','page']一样
        error_messages = {   #自己定义错误信息。
            'page' :{
            'required':'请传入page参数',  #一个字段都没有传
            'invalid':'请输入一个可用得page参数'  #传了错误得字段
            },
            'title' :{
                'max_length' : 'title不能超过100个字符'

            },
            'price':{
                'max_value':'图书价格不能超过1000'
            }
        }

这样  我们在视图函数里引用form就可以了:

def add_book(request):
    form = AddBookForm(request.POST)
    if form.is_valid():
        title = form.cleaned_data.get('title')
        page = form.cleaned_data.get('page')
        price = form.cleaned_data.get('price')
        print('title:{}'.format(title))
        print('page:{}'.format(page))
        print('price:{}'.format(price))
        return HttpResponse('success')
     form.save() #调用save方法就把数据保存到数据库中,不用一个一个取
else: print(form.errors.get_json_data()) return HttpResponse('FAIL')

save方法调用:

  • 直接调用save方法必须保证表单上面已经有你这个模型所需要的所有的数据。

我们可以再写一个注册的modelform:

class RegisterForm(forms.ModelForm):
    pwd1 = forms.CharField(max_length=16,min_length=6)
    pwd2 = forms.CharField(max_length=16,min_length=6)
    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
    class Meta:
        model = User
        exclude = {'password'}

然后在views里写

@require_http_methods('POST')
def register(request):
    form = RegisterForm(request.POST)
    if form.is_valid():
        user = form.save(commit=False)   #只是会生成一个user对象,并不会保存到数据库
        user.password = form.cleaned_data.get('pwd1')
        user.save()    #这样就会将所有数据保存了。
原文地址:https://www.cnblogs.com/nihao2/p/12291571.html