【Youtobe trydjango】Django2.2教程和React实战系列九【Django模型表单、HTML原生表单、纯Django表单、表单验证方法和初始化方法】

本文主要是介绍【Youtobe trydjango】Django2.2教程和React实战系列九【Django模型表单、HTML原生表单、纯Django表单、表单验证方法和初始化方法】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【Youtobe trydjango】Django2.2教程和React实战系列九【Django模型表单、HTML原生表单、纯Django表单、表单验证方法和初始化方法】

  • 1. Django模型表单
    • 1.1. 模型表单
    • 1.2. 视图函数
    • 1.3. 前端模板
    • 1.4. 路由
    • 1.5. 效果
  • 2. HTML原生表单
    • 2.1. 修改前端文件
  • 3. 纯Django表单
    • 3.1. 表单模型
    • 3.2. 视图
    • 3.3. 模板
    • 3.4. 表单属性
    • 3.5. 表单验证方法
    • 3.6. 表单初始值

1. Django模型表单

1.1. 模型表单

新建表单模型文件:src\trydjango\products\forms.py

from django import formsfrom .models import Productclass ProductForm(forms.ModelForm):class Meta:model = Productfields = ['title','description','price',]

1.2. 视图函数

src\trydjango\products\views.py视图中新增视图函数product_create_view

from .forms import ProductFormdef product_create_view(request):form = ProductForm(request.POST or None)if form.is_valid():form.save()context = {'form': form,}return render(request, "products/product_create.html", context)

1.3. 前端模板

products应用中新建模板文件templates\products\product_create.html

{% extends 'base.html' %}{% block content %}
<form>
{{ form.as_p }}
<input type='submit' value='Save' />
</form>
{% endblock %}

1.4. 路由

项目路由中urls.py新增

from products.views import product_create_viewpath('create/', product_create_view),       # 创建产品

1.5. 效果

效果
在这里插入图片描述

在这里插入图片描述

products应用中的模板文件templates\products\product_create.html修改为

{% extends 'base.html' %}{% block content %}
<form method='POST'> {% csrf_token %}
{{ form.as_p }}
<input type='submit' value='Save' />
</form>
{% endblock %}

重新提交创建请求 查看报错:
在这里插入图片描述

原因是因为模型中的必填项布尔类型字段featured没有值,给一个默认值,并进行数据库迁移操作:

在这里插入图片描述

重新测试,成功创建数据:

在这里插入图片描述

想要做出一个插入成功后,后端再返回一个空form效果,只需要在views.py增加这样一句:
form = ProductForm()
在这里插入图片描述

重启开发服务器后,插入数据后页面重新载入一个空表单。

2. HTML原生表单

2.1. 修改前端文件

templates\products\product_create.html

{% extends 'base.html' %}{% block content %}
<form method='POST'><input type='text' name='title' placeholder='Your title'><input type='submit' value='Save' />
</form>
{% endblock %}

视图函数
src\trydjango\products\views.py视图中修改视图函数product_create_view

def product_create_view(request):context = {}return render(request, "products/product_create.html", context)

解决csrf
待定
在这里插入图片描述

表单方法改成GET <form method='GET'>试一下
在这里插入图片描述
表单改成<form action='/search/' method='POST'>试一下,相当于跳转到另一个url
在这里插入图片描述
将html这两行改成

<form action='https://www.bing.com/search' method='GET'> <input type='text' name='q' placeholder='Your search'>

测试下
在这里插入图片描述

表单中添加csrf防中间人攻击
<form action='.' method='POST'> {% csrf_token %}
页面提交不会报403

views.py
打印请求看一下

def product_create_view(request):print(request.GET)print(request.POST)context = {}return render(request, "products/product_create.html", context)

在这里插入图片描述

在这里插入图片描述
product_create_view方法:

def product_create_view(request):# print(request.GET)# print(request.POST['title'])if request.method == 'POST':my_new_title = request.POST.get('title')print(my_new_title)# Product.objects.create(title=my_new_title)context = {}return render(request, "products/product_create.html", context)

在这里插入图片描述

3. 纯Django表单

3.1. 表单模型

forms.py

from django import formsclass RawProductForm(forms.Form):title       = forms.CharField()description = forms.CharField()price = forms.DecimalField()

3.2. 视图

views.py.py

from .forms import ProductForm, RawProductFormdef product_create_view(request):my_form = RawProductForm()context = {'form': my_form,}return render(request, "products/product_create.html", context)

3.3. 模板

form.as_ul

{% extends 'base.html' %}{% block content %}
<form action='.' method='POST'> {% csrf_token %}{{ form.as_ul }}<input type='submit' value='Save' />
</form>
{% endblock %}

form.as_p

在这里插入图片描述

views.py
探究下Django的表单验证RawProductForm方法塞request.POST参数:

def product_create_view(request):my_form = RawProductForm(request.POST)context = {'form': my_form,}return render(request, "products/product_create.html", context)

会提示必填字段
在这里插入图片描述
添加表单验证:

def product_create_view(request):my_form = RawProductForm()if request.method == 'POST':my_form = RawProductForm(request.POST)if my_form.is_valid():# now the data is goodprint(my_form.cleaned_data)else:print(my_form.errors)context = {'form': my_form,}return render(request, "products/product_create.html", context)

在这里插入图片描述

将前端价格输入框改成text类型
在这里插入图片描述
在价格输入框填写非数字提交测试:
前端返回验证表单数据结果:
在这里插入图片描述
后端请求:
在这里插入图片描述
验证有了之后,在验证表单数据没问题后,可以使用django orm将数据保存进数据库:

Product.objects.create(my_form.cleaned_data)

在这里插入图片描述
测试一下,会报参数错误,
在这里插入图片描述
在参数前加**代表将一个可变的关键字参数的字典传给函数实参
在这里插入图片描述
此时数据已经创建成功
在这里插入图片描述

3.4. 表单属性

forms.py

class RawProductForm(forms.Form):title = forms.CharField(label='')description = forms.CharField(required=False)price = forms.DecimalField(initial=66.6)

在这里插入图片描述

修改下属性

class RawProductForm(forms.Form):title = forms.CharField(label='', widget=forms.TextInput(attrs={'placeholder': "Your title"}))description = forms.CharField(required=False,widget=forms.Textarea(attrs={'class': "new-class-name two",'id': "my-id-for-textarea",'rows': 20,'cols': 100,}))price = forms.DecimalField(initial=66.6)

在这里插入图片描述

3.5. 表单验证方法

将上面views.py的原生Django表单对应的product_create_view方法注释掉,回到最开始的Django模型表单对应的方法,解开注释:

forms.py然后将模型RawProductForm的字段复制到ProductForm中:

在这里插入图片描述
ProductForm模型添加clean_title验证标题的方法案例:

class ProductForm(forms.ModelForm):title = forms.CharField(label='', widget=forms.TextInput(attrs={'placeholder': "Your title"}))description = forms.CharField(required=False,widget=forms.Textarea(attrs={'class': "new-class-name two",'id': "my-id-for-textarea",'rows': 20,'cols': 100,}))price = forms.DecimalField(initial=66.6)class Meta:model = Productfields = ['title','description','price',]def clean_title(self, *args, **kwargs):title = self.cleaned_data.get('title')if "admin" in title:return titleelse:raise forms.ValidationError("This is not a valid title")

测试结果
在这里插入图片描述
clean_title方法改成

    def clean_title(self, *args, **kwargs):title = self.cleaned_data.get('title')if not "admin" in title:raise forms.ValidationError("This is not a valid title")if not "news" in title:raise forms.ValidationError("This is not a valid title")return title

在这里插入图片描述

在这里插入图片描述

再来一个验证email字段的例子:

class ProductForm(forms.ModelForm):title       = forms.CharField(label='', widget=forms.TextInput(attrs={'placeholder': "Your title"}))email       = forms.EmailField()description = forms.CharField(required=False,widget=forms.Textarea(attrs={'class': "new-class-name two",'id': "my-id-for-textarea",'rows': 20,'cols': 100,}))price       = forms.DecimalField(initial=66.6)class Meta:model = Productfields = ['title','email','description','price',]def clean_title(self, *args, **kwargs):title = self.cleaned_data.get('title')if not "admin" in title:raise forms.ValidationError("This is not a valid title")if not "news" in title:raise forms.ValidationError("This is not a valid title")return titledef clean_email(self, *args, **kwargs):email = self.cleaned_data.get('email')if not "edu" in email:raise forms.ValidationError("This is not a valid email")return email

在这里插入图片描述
邮箱中包含edu字符串则可以通过验证

3.6. 表单初始值

将刚才views.py中的视图函数product_create_view注释并复制一份,修改成如下:

def product_create_view(request):initial_data = {'title': 'This is a initial valid admin news title!',}# obj = Product.objects.get(id=1)form = RawProductForm(request.POST or None, initial=initial_data)context = {'form': form,}return render(request, "products/product_create.html", context)

这一个RawProductForm 纯Django 表单初始化字段值的例子:

在这里插入图片描述

def product_create_view(request):initial_data = {'title': 'This is a initial valid admin news title!',}obj = Product.objects.get(id=1)form = ProductForm(request.POST or None, initial=initial_data, instance=obj)context = {'form': form,}return render(request, "products/product_create.html", context)

在这里插入图片描述
加数据验证后保存信息

def product_create_view(request):initial_data = {'title': 'This is a initial valid admin news title!',}obj = Product.objects.get(id=1)form = ProductForm(request.POST or None, initial=initial_data, instance=obj)if form.is_valid():form.save()form = ProductForm()context = {'form': form,}return render(request, "products/product_create.html", context)

在这里插入图片描述
然后再刷新url 可以看到加载的id为1的数据被修改掉了
在这里插入图片描述
从数据库看下也是一样的:
在这里插入图片描述

这篇关于【Youtobe trydjango】Django2.2教程和React实战系列九【Django模型表单、HTML原生表单、纯Django表单、表单验证方法和初始化方法】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/210145

相关文章

postgresql使用UUID函数的方法

《postgresql使用UUID函数的方法》本文给大家介绍postgresql使用UUID函数的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录PostgreSQL有两种生成uuid的方法。可以先通过sql查看是否已安装扩展函数,和可以安装的扩展函数

Java中Arrays类和Collections类常用方法示例详解

《Java中Arrays类和Collections类常用方法示例详解》本文总结了Java中Arrays和Collections类的常用方法,涵盖数组填充、排序、搜索、复制、列表转换等操作,帮助开发者高... 目录Arrays.fill()相关用法Arrays.toString()Arrays.sort()A

从入门到进阶讲解Python自动化Playwright实战指南

《从入门到进阶讲解Python自动化Playwright实战指南》Playwright是针对Python语言的纯自动化工具,它可以通过单个API自动执行Chromium,Firefox和WebKit... 目录Playwright 简介核心优势安装步骤观点与案例结合Playwright 核心功能从零开始学习

Nginx安全防护的多种方法

《Nginx安全防护的多种方法》在生产环境中,需要隐藏Nginx的版本号,以避免泄漏Nginx的版本,使攻击者不能针对特定版本进行攻击,下面就来介绍一下Nginx安全防护的方法,感兴趣的可以了解一下... 目录核心安全配置1.编译安装 Nginx2.隐藏版本号3.限制危险请求方法4.请求限制(CC攻击防御)

MySQL 主从复制部署及验证(示例详解)

《MySQL主从复制部署及验证(示例详解)》本文介绍MySQL主从复制部署步骤及学校管理数据库创建脚本,包含表结构设计、示例数据插入和查询语句,用于验证主从同步功能,感兴趣的朋友一起看看吧... 目录mysql 主从复制部署指南部署步骤1.环境准备2. 主服务器配置3. 创建复制用户4. 获取主服务器状态5

python生成随机唯一id的几种实现方法

《python生成随机唯一id的几种实现方法》在Python中生成随机唯一ID有多种方法,根据不同的需求场景可以选择最适合的方案,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习... 目录方法 1:使用 UUID 模块(推荐)方法 2:使用 Secrets 模块(安全敏感场景)方法

Java docx4j高效处理Word文档的实战指南

《Javadocx4j高效处理Word文档的实战指南》对于需要在Java应用程序中生成、修改或处理Word文档的开发者来说,docx4j是一个强大而专业的选择,下面我们就来看看docx4j的具体使用... 目录引言一、环境准备与基础配置1.1 Maven依赖配置1.2 初始化测试类二、增强版文档操作示例2.

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

MySQL深分页进行性能优化的常见方法

《MySQL深分页进行性能优化的常见方法》在Web应用中,分页查询是数据库操作中的常见需求,然而,在面对大型数据集时,深分页(deeppagination)却成为了性能优化的一个挑战,在本文中,我们将... 目录引言:深分页,真的只是“翻页慢”那么简单吗?一、背景介绍二、深分页的性能问题三、业务场景分析四、