• 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>
  • 相关阅读:
    Android
    Android
    Android
    Android
    Android
    【工作中学习】CreateProcessAsUser失败,错误码:1314
    【Angular JS】网站使用社会化评论插件,以及过程中碰到的坑
    【Angular JS】正确调用JQuery与Angular JS脚本
    【工作】Proxy Server的优化
    AWS ELB Sticky Session有问题?别忘了AWSELB cookie
  • 原文地址:https://www.cnblogs.com/qinghe123/p/11398990.html
Copyright © 2020-2023  润新知