最近在项目上用到了 Django 的自带的 Form 表单,遇到了一些坑,今天给大家出的这篇Python基础教程也是做了一个简单的总结,大家可以对号出坑。 Form 基础介绍 首先让我们先来了解下 Django 中 Form 表单的基本用法。Django 中提供了两种 Form 表单类型,一种是 forms.Form ,另外一种是 forms.ModelForm 。很明显,一种是普通的 Form 表单类型,另外一种是和 Model 有关联的表单类型。官方文档中是这样来介绍 ModelForm 的:
对于 Django 中的 Form 表单的用法,我们只需要了解以下几点:
问题总结 在这次项目需求中,我主要遇到的问题是,有几个表单页面,后台使用同一张表去做存储,但是每个页面有许多变化的元素,如果为了存储这些可变的值,每个元素都用数据库一个字段去做存储不太现实,因为需求是一直在变化的。所以我采用的解决办法是提取公共的元素,其他可变的元素用了一个json字段存在数据库中。 而这样导致的问题就是,不能使用 ModelForm ,我选择了使用普通的 forms.Form 。这样遇到了一些问题,总结如下: 1 . forms.Form 的初始化 有两种初始化方式: # 第一种方式: 基于这两种做法,我很显然的在 view.py 中写出了这样的代码: def create_user(request): 看上去一切安好,代码也十分简单。但问题来了,新建还行,但当我们使用编辑的时候,会发现,没办法做修改,即当代码走到 form.is_valid() 时,它始终做了 dict 的初始化,它不再会接受你新输入的值。 解决思路如下: 每次都初始化一个空的 form ,前端渲染页面时,用 js 去控制页面的展示。这也比较简单,这里不做多的说明。 2 . 图片格式编辑页如何获取之前展示的结果 对于图片,新建的时候上传还比较简单,问题是在于如果是编辑,如何带回原来的上传结果。我们都知道 是没办法赋值的。所以表单初始化的时候,也没有办法进行赋值。 解决思路如下: 在表单中新开一个字段,用来存储上传后的图片链接,当图片未上传时,整个 div 隐藏,当图片有值时,整个 div 展示。后端通过判断真正的 file 字段 与 url 字段,来判断是否有新上传文件 3 . clean_xxx 方法未返回值时,form.clean_data[‘xxx’] 获取不到值 这是需要比较注意的一点,我们可以通过写 clean_xxx(self) 的方法,来对表单的某个属性做校验,但一旦校验通过,注意一定要返回当前输入的值。正确示例如下: class UserForm(forms.Form): 小结 form.Forms 我还算是比较经常用的,我觉得封装了很多比较好的用法,比如限制必输,限制最小值、最大值等。只要避免一些坑,就会比较得心应手了。希望这次总结的坑,你没有入!也欢迎大家的补充! |
|
来自: 千锋Python学堂 > 《Python基础教程分享》