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。这些信息都可以在官方文档上获取,就不一一介绍了。







0 0
原创粉丝点击