django中只使用ModleForm的表单验证
作者:野生大虾 时间:2021-02-03 15:41:50
主题
众所周知,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.errors
。errors
是ErrorDict()
的实例,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、多看源码
来源:https://www.cnblogs.com/mooremok/p/17003453.html
标签:django,ModleForm
0
投稿
猜你喜欢
PHP PDOStatement::bindValue讲解
2023-06-14 11:16:02
django执行数据库查询之后实现返回的结果集转json
2024-01-18 12:29:22
Python实现自动化刷抖音的实例
2023-07-20 19:16:15
正确理解python中的关键字“with”与上下文管理器
2022-10-26 18:05:02
sqlserver 存储过程中的top+变量使用分析(downmoon)
2024-01-13 13:03:41
windows系统mysql5.7.18安装图文教程
2024-01-26 04:40:59
浅析JavaScript中的array数组类型系统
2024-04-17 10:04:21
Python迭代器iterator生成器generator使用解析
2023-11-17 18:50:24
swfupload上传使用代码说明ASP版
2011-11-27 09:34:32
解决bootstrap中使用modal加载kindeditor时弹出层文本框不能输入的问题
2024-04-16 09:26:21
mysql中合并两个字段的方法分享
2024-01-21 19:01:44
发布你的Python模块详解
2021-06-10 02:03:53
python实现登录与注册系统
2022-04-26 02:32:38
Python3.6 + TensorFlow 安装配置图文教程(Windows 64 bit)
2021-07-28 21:15:04
使用Py2Exe for Python3创建自己的exe程序示例
2021-12-25 21:21:10
python爬虫实现教程转换成 PDF 电子书
2023-08-12 21:51:27
再谈“字符串拼接”的效率
2009-04-30 12:48:00
python 用所有标点符号分隔句子的示例
2022-09-18 01:41:57
web版Photoshop来了
2008-04-21 13:39:00
javascript设置和获取cookie的方法实例详解
2024-04-22 13:05:08