【问题标题】:How to efficiently initial data in Django forms.Form?如何有效地在 Django forms.Form 中初始化数据?
【发布时间】:2011-03-28 00:24:03
【问题描述】:

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

但是当我需要编辑它们时,如果我通过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 的情况下缩短此时间?

【问题讨论】:

  • 不清楚您要对表单执行什么操作。你是什​​么意思:“如果我通过 form.ModelForm 创建表单类,我可以将 instace=artcile 传递给表单,就是这样。”在使用模型表单不适合您的情况下,您想做什么?

标签: django django-models django-forms


【解决方案1】:

您可以使用来自django.forms.modelsmodel_to_dictfields_for_model 工具:

# 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 关系,你可以为它创建一个表单集:

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()])

然后您可以遍历表单集以访问为相关模型创建的表单:

for form in formset.forms:
    print form

【讨论】:

  • model_to_dict 中的 case 怎么样?,我用文章更改它,但是当表单与文章的相关标签有问题时,显示如下-> "tag", "tag", "tag3" , “文章”,当我更新文章时,它会像这样 -> “”“”标签“”“”,“标签”“”,“'''”“标签3”“”“”????
  • 我不确定我是否理解您所描述的内容——您是否遇到错误?
  • 我没有收到任何错误,但它不适合我的带有 ManyToMany 关系标签的文章模型!
  • 我认为最好在表单类中创建一个函数来执行此操作,啊哈?
  • @lettertwo 不要添加另一个答案,只需编辑此答案以包含有关表单集的信息,因为该答案本身并不能回答原始问题。
猜你喜欢
  • 1970-01-01
  • 2013-01-25
  • 2015-01-06
  • 2011-12-16
  • 2015-12-17
  • 1970-01-01
  • 2022-07-12
  • 1970-01-01
  • 2020-10-25
相关资源
最近更新 更多