例如,我有博客文章的文章模型,因此很容易将文章添加到数据库中。
但是当我需要编辑它们时,如果我按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 :(得分:2)
您可以使用model_to_dict
中的fields_for_model
和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