django中只使用ModleForm的表单验证

 更新时间:2022年12月25日 09:09:01   作者:野生大虾  
这篇文章主要介绍了django中只使用ModleForm的表单验证的相关资料,需要的朋友可以参考下

主题

众所周知,django.forms极其强大,不少的框架也借鉴了这个模式,如Scrapy。在表单验证时,django.forms是一绝,也是面向对象的经典表现。但要用它来渲染表单那就不好玩了,除非写框架。本文章主要缕一缕如何使用django.forms来做表单验证。

django项目基本信息

  • models.py
from django.db import models


class Article(models.Model):
    title = models.CharField(max_length=50, verbose_name='标题')
    content = models.TextField(verbose_name='内容')
    create_date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title
  • forms.py

同目录下创建一个forms.py

from django.forms import ModelForm
from django import forms
from . models import Article
from django.core.exceptions import ValidationError

class ArticleForm(ModelForm):
    class Meta:
        model = Article
        exclude = ['id']
    
    def clean(self):
        cleaned_data = super().clean()
        title = cleaned_data.get('title')
        if 'My' not in title:
            raise ValidationError('标题中必须包含My字样', code='title')
  • views.py
    在views中,创建一个增加Article的方法
def add(request):
    if request.method == 'GET':
        return render(request, 'add.html')
    else:
        form = ArticleForm(request.POST)
        # 主要了解的是表单的验证
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/show/')
        else:
            form.errors.as_data()            # {'__all__': [ValidationError(['标题中必须包含My字样'])]}
            form.errors.get_context()        # {'errors': dict_items([('__all__', ['标题中必须包含My字样'])]), 'error_class': 'errorlist'}
            d = form.errors.get_json_data()  # {'__all__': [{'message': '标题中必须包含My字样', 'code': 'title'}]}
            return HttpResponse(d.get('__all__'))

核心分析

如果是在admin中使用ModelForm的验证,那也是非常方便的,如果我们要在用户的前端响应中使用表单验证,且又不通过django.forms渲染的表单来传递验证结果,则需要看看源码:
ModelForm.errorserrorsErrorDict()的实例,ErrorDict源码:

class ErrorDict(dict, RenderableErrorMixin):
    """
    A collection of errors that knows how to display itself in various formats.

    The dictionary keys are the field names, and the values are the errors.
    """

    template_name = "django/forms/errors/dict/default.html"
    template_name_text = "django/forms/errors/dict/text.txt"
    template_name_ul = "django/forms/errors/dict/ul.html"

    def __init__(self, *args, renderer=None, **kwargs):
        super().__init__(*args, **kwargs)
        self.renderer = renderer or get_default_renderer()

    def as_data(self):
        return {f: e.as_data() for f, e in self.items()}

    def get_json_data(self, escape_html=False):
        return {f: e.get_json_data(escape_html) for f, e in self.items()}

    def get_context(self):
        return {
            "errors": self.items(),
            "error_class": "errorlist",
        }

三个方法返回的都是字典,但数据结构不同,可以看情况而定。值得注意的是,在ArticleForm中,raise ValidationError时,如果code传入参数时,它将会在get_context()中显式体现出来。

总结

1、掌握这个原理,传统的全栈开发可以节省更多的时间。
2、多看源码

到此这篇关于django中只使用ModleForm的表单验证的文章就介绍到这了,更多相关django ModleForm的表单验证内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决使用pip安装报错:Microsoft Visual C++ 14.0 is required.

    解决使用pip安装报错:Microsoft Visual C++ 14.0 is required.

    对于程序员来说,经常pip安装自己所需要的包,大部分的包基本都能安装,但是总会遇到包安装不了的问题,下面这篇文章主要给大家介绍了关于如何解决使用pip安装报错:Microsoft Visual C++ 14.0 is required.的相关资料,需要的朋友可以参考下
    2022-09-09
  • Python lambda表达式用法实例分析

    Python lambda表达式用法实例分析

    这篇文章主要介绍了Python lambda表达式用法,结合实例形式分析了lambda表达式的具体功能、应用场景及相关使用技巧,需要的朋友可以参考下
    2018-12-12
  • python b站视频下载的五种版本

    python b站视频下载的五种版本

    该项目用于Bilibili(b站)视频下载(支持分P多段视频的下载),基于python开发,有此需求的朋友可以参考下
    2021-05-05
  • 用python实现爬取奥特曼图片实例

    用python实现爬取奥特曼图片实例

    大家好,本篇文章主要讲的是用python实现爬取奥特曼图片实例,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • python打印n位数“水仙花数”(实例代码)

    python打印n位数“水仙花数”(实例代码)

    这篇文章主要介绍了python打印n位数“水仙花数”,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-12-12
  • PyTorch实现联邦学习的基本算法FedAvg

    PyTorch实现联邦学习的基本算法FedAvg

    这篇文章主要为大家介绍了PyTorch实现联邦学习的基本算法FedAvg,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Python正则捕获操作示例

    Python正则捕获操作示例

    这篇文章主要介绍了Python正则捕获操作,结合具体实例形式分析了Python基于正则表达式的分组、捕获、替换等相关操作技巧,需要的朋友可以参考下
    2017-08-08
  • Python学习小技巧总结

    Python学习小技巧总结

    本篇文章给大家总结了关于python相关知识点学习的技巧以及难点,有兴趣的朋友可以参考学习下。
    2018-06-06
  • Django模板语言 Tags使用详解

    Django模板语言 Tags使用详解

    这篇文章主要介绍了Django模板语言 Tags使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • python生成单位阵或对角阵的三种方式小结

    python生成单位阵或对角阵的三种方式小结

    这篇文章主要介绍了python生成单位阵或对角阵的三种方式小结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05

最新评论