Django中的表单(forms.ModelForm)

model.py
class Book(models.Model):
    title=models.CharField(max_length=32)
    price=models.DecimalField(max_digits=8,decimal_places=2)
    pub_date=models.DateField()
    publish=models.ForeignKey("Publish")
    authors=models.ManyToManyField("Author")
    def __str__(self): return self.title

forms.py
#Modelform将一个model转化成一个form组件
class BookModelForm(forms.ModelForm):
     class Meta:
        model=models.Book
        fields="__all__"
这一步做的事情相当于下面的代码
'''
class BookModelForm(form.Form):
     title=forms.CharField(max_length=32)
     price=forms.IntegerField()
     pub_date=forms.DateField()

'''

在定义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'
 
            }
 
        }
 
from django.http import HttpResponse
from django.shortcuts import render
 
from django.views.generic import View
from one.forms import AddBookForm
 
3、views.py文件:
# 定义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>

文章来源:https://blog.csdn.net/qq_33867131/article/details/83346047

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值