Django表单(forms.ModelForm)
在定义forms.py表单的时候,很多字段信息是和models.py文件里的模型基本上是一模一样的,
为了避免重复的代码,我们引入了ModelForm,将模型和表单进行绑定,示例代码如下:
(用法和forms.Form表单一样)
1、models.py文件
from django.db import models from django.core import validators class Book(models.Model): title = models.CharField(max_length=100) page = models.IntegerField() # price = models.FloatField() # 可以直接在建表的时候单独给某个字段加验证器:限制价格不能超过1000 price = models.FloatField(validators.MaxValueValidator(limit_value=1000))
2、app新建forms.py文件
from django import forms # 注意是django下的forms from one.models import Book # 将表单AddBookForm与Book模型进行绑定 # 继承的是forms.ModelForm class AddBookForm(forms.ModelForm): # 单独控制某个字段,函数名固定格式,clean_字段名 def clean_page(self): # 获取page字段 page = self.cleaned_data.get('page') if page > 100: raise forms.ValidationError("页数不能大于100!") class Meta: model = Book fields = "__all__" # fields = ['title', 'page'] # exclude = ['price'] # 除了price字段 # 自定义错误消息 error_messages = { 'title': { 'max_length': '最多不能超过10个字符!', 'min_length': '最少不能少于3个字符!' }, 'content': { 'required': '必须输入content!', }, 'page': { 'required': 'page参数必须字段,请传值', 'invalid': '请输入一个可用的page参数' }, 'price': { 'max_value': '图书价格不能超过1000' } }
3、views.py视图函数
from django.http import HttpResponse from django.shortcuts import render from django.views.generic import View from one.forms import AddBookForm # 定义GET或者POST方法:根据是GET还是POST请求来做相应的操作 class IndexView(View): # 如果是GET请求,那么返回一个空的表单 def get(self, request): form = AddBookForm() return render(request, 'one/index.html', {'form': form}) # 如果是POST请求,那么将提交上来的数据进行校验 def post(self, 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('=' * 30) print(title) print(page) print(price) print('=' * 30) # 在验证完成后直接调用save方法,就可以将这个数据保存到数据库中了 form.save() return HttpResponse('表单验证成功') else: # 点上get_json_data()它,打印的错误信息会以json方式显示 print(form.errors.get_json_data()) return HttpResponse('表单验证失败')
4、路由
from django.urls import path from .views import * urlpatterns = [ path('index/', index, name='index'), path('', IndexView.as_view()), ]
5、index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="" method="post"> <table> {{ form.as_table }} <tr> <td></td> <td><input type="submit" value="提交"></td> </tr> </table> </form> </body> </html>