如何在Django forms.Form中有效地初始化数据?

时间:2011-03-28 00:24:04

标签: django django-models django-forms

例如,我有博客文章的文章模型,因此很容易将文章添加到数据库中。

但是当我需要编辑它们时,如果我按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的情况下做到这一点?

1 个答案:

答案 0 :(得分:2)

您可以使用model_to_dict中的fields_for_modeldjango.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