2011-03-28 93 views
2

例如,我有博客文章的文章模型,所以很容易将文章添加到数据库。如何在Django forms.Form中有效地初始化数据?

但是,当我需要编辑它们时,如果我通过form.ModelForm创建表单类,我可以将instace=artcile传递给表单,就是这样。

但是,如果我通过form.Forms创建表单类,我必须声明一个表单实例并将字段逐个传递给表单。

像这样的事情

form = ArticleForm({ 
    'title': article.title, 
    'body': article.body, 
    'pub_date': article.pub_date 
    'status': article.status, 
    'author': article.author, 
    'comments': article.comments.count(), 
    'blah': article.blahblah, 
    'againBlah': article.againBlah, 
    ..... 
}) 

这是丑陋的,是不是? 有没有办法做到这一点更短,而不使用form.ModelForm

+0

目前尚不清楚你想用你的表格做什么。你是什​​么意思:“如果我通过form.ModelForm创建表单类,我可以通过instace = artcile来形成,就是这样。”你在使用模型表单不适合你的地方想做什么? – DTing 2011-03-28 03:13:02

回答

2

您可以使用model_to_dictfields_for_model utils的从django.forms.models

# assuming article is an instance of your Article model: 
from django.forms import Form 
from django.forms.models import fields_for_model, model_to_dict 

form = Form(model_to_dict(article)) 
form.fields.update(fields_for_model(article)) 

如果你有一个M2M关系,你可以为它创建一个formset:

from django import forms 
from django.forms.models import model_to_dict, fields_for_model 
from django.forms.formsets import formset_factory 

# assuming your related model is called 'Tag' 
class TagForm(forms.Form): 

    def __init__(self, *args, **kwargs): 
     super(TagForm, self).__init__(*args, **kwargs) 
     self.fields.update(fields_for_model(Tag)) 


TagFormSet = formset_factory(TagForm) 
formset = TagFormSet(initial=[model_to_dict(tag) for tag in article.tags.all()]) 

然后你就可以通过迭代formset访问为相关模型创建的表单:

for form in formset.forms: 
    print form 
+0

怎么样在model_to_dict ?,我改变它与文章,但是当表单相关标签为文章有问题,并显示像这样 - >“标签”,“标签”,“tag3”,“文章”,当我更新文章就像这样 - >“”“”tag“”“”“,”“tag”“”,“'''”“”tag3“”“”“? – 2011-03-28 01:41:26

+0

哎呀!那是一个错字,现在应该读“文章”。 – lettertwo 2011-03-28 01:47:20

+0

我不确定我是否理解你描述的内容 - 是否收到错误? – lettertwo 2011-03-28 01:50:21