django Creating forms from models(用models来创建forms)
来源:互联网 发布:网络系统集成基础 编辑:程序博客网 时间:2024/04/28 16:10
官方文档:https://docs.djangoproject.com/en/dev/topics/forms/modelforms/
一 问题起因
最近在纠结一个问题,django里面的form.py里定义了一个form,它其中一个字段是对应着model的一个foreignkey,例如叫user_id。
models是这样的:
class UserProfile(models.Model): user = models.ForeignKey(User) user_name = models.CharField(max_length = 20) nick_name = models.CharField(max_length = 60) school = models.CharField(max_length = 60) college = models.CharField(max_length = 60) graduation_year = models.CharField(max_length = 20) def __unicode__(self): return u'%s %s' % (self.user_name,self.nick_name)
想自己定义一个form来为这个model添加数据,如果这样定义:
class UserForm(forms.Form): user_id = forms.CharField(max_length = 20) nick_name = forms.CharField(max_length = 60)我的原意是想让user_id作为外键,但是这样定义的话user_id的值是可以随意输入的,保存的时候肯定会报错:Cannot add or update a child row: a foreign key constraint fails 。
二 如何找到解决方案
于是就在百度上搜怎么在form里面限制一个字段为foreignkey,它的值应该是在一个范围内可以选择的。百度半天没有结果。。。然后就google搜“django form foreignkey field”,出来了一个意想不到的结果,Creating forms from models。看样子意思是可以通过models来直接创建forms,这样不就解决了我之前的问题?而且这个model的所有字段都可以同步到form里,不需要一个个去对应起来。
三 ModelForm解析
ModelForm的意思就是用model来创建一个form,先看官方网站上的一个例子:
>>> from django.forms import ModelForm>>> from myapp.models import Article<span style="white-space:pre"></span>#引入model# Create the form class.>>> class ArticleForm(ModelForm):... class Meta:... model = Article<span style="white-space:pre"></span>#指定这个form是用来处理哪个model的... fields = ['pub_date', 'headline', 'content', 'reporter']<span style="white-space:pre"></span>#自己这个form能处理model里的哪些field# Creating a form to add an article.>>> form = ArticleForm()# Creating a form to change an existing article.>>> article = Article.objects.get(pk=1)>>> form = ArticleForm(instance=article)有一个事先已经定义好的model,叫Article。然后自己定义了一个ArticleForm来方便在网站上处理表单数据。还可以自己定义form要处理model里的哪些字段。
这样把form和model对应起来就涉及一个问题。在model里面有field,每个field有自己的定义方式,而form里面也有field的。那么model中的field type和form 中的field type就要有一个映射的关系。例如:model里面的CharField对应form里面的Charfield;model里面的ManyToManyField 对应form里面的MultipleChoiceField。这个好解理,model和数据库相关,ManyToMany比较符合sql语句里的定义。form是处理网页上的表单的,用MultipleChoice表示一个多选框,也很合理。这个映射关系在官方文档里面介绍了。我们用的时候好像也不需要直接用到这个。
验证ModelForm Validation on a ModelForm
这就分为两步,1是要验证form的内容正确,2是要验证models的内容正确。
ModelForm.save()用来保存
选择哪些field由form来管理
1 fields = '__all__'。model中所有的field都由form来管理,不过也可以不写这一行。
2 fields = ['pub_date','headline'] 设置这些field由form管理
3 exclude = ['title'] 设置这些field不由form管理
还有其他的一些使用技巧,例如:可以override一个field,可以继承自己定义好的这个ModelForm。这些信息都可以在官方文档上获取,就不一一介绍了。
- django Creating forms from models(用models来创建forms)
- Django models & forms
- Django从models创建表单(forms)
- 基于 Django1.10 文档的深入学习(26)—— Creating forms from models 之 基础
- Django cms项目之models.py,admin.py,forms.py(2)
- Django项目创建之---Models(三)
- Django Models
- django models
- Django Models
- django开发电子商城(二)商品models创建
- Django学习(4):Models
- Django入门(三、Models)
- Django从已有数据库创建Models
- 使用Django的models创建mysql数据库
- Django 根据数据模型models创建数据表
- Django使用forms来实现评论功能
- Django 学习笔记(二) 《models》
- Django简易教程之一(models)
- 硬币找钱问题,求所有可能解决方案数目,最少的钱币数目,每种钱币用多少张
- OWI(Oracle Wait Interface)方法论介绍
- JUnit4.8.2源代码分析-5.1 Statement之复合命令
- 使用PD进行数据模型设计时 使name和comment关联
- C++装饰模式--Decorator
- django Creating forms from models(用models来创建forms)
- No.2 Handler使用总结
- UDP中的Connect
- 日语学习之沪江整理 20141018
- uniq
- linux df查看磁盘空间与du统计不一致
- 简单记录
- android中开启ProgressDialog进度条之后,按下回退建,不会关闭进度条的实现
- pagefile.sys文件删除及移动方法