2011-03-28 50 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