【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

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

【 html+css 绚丽Loading 】000046 三才归元阵

前言:哈喽,大家好,今天给大家分享html+css 绚丽Loading!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 📚一、效果📚二、信息💡1.简介:💡2.外观描述:💡3.使用方式:💡4.战斗方式:💡5.提升:💡6.传说: 📚三、源代码,上代码,可以直接复制使用🎥效果🗂️目录✍️

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件