【问题标题】:One form for two models两种型号的一种形式
【发布时间】:2011-02-03 13:34:39
【问题描述】:

更新问题解决了,你能看到的所有代码都可以了。

你好!

我在 TextPage 和 Paragraph 之间有一个 ForeignKey 关系,我的目标是让前端 TextPage 创建/编辑表单就像在 ModelAdmin 中一样使用“inlines”:TextPage 的几个字段,然后堆叠了几个 Paragraph 实例排队。问题是我不知道如何验证和保存它:

@login_required
def textpage_add(request):
    profile = request.user.profile_set.all()[0]
    if not (profile.is_admin() or profile.is_editor()):
        raise Http404
    PageFormSet = inlineformset_factory(TextPage, Paragraph, fields=('title', 'text', ), extra=5)
    textpage = TextPage()
    if request.POST:
        textpageform = TextPageForm(request.POST, instance=textpage, prefix='page')
        formset = PageFormSet(request.POST, instance=textpage, prefix='paragraphs')
        # Saving data
        if textpageform.is_valid():
            textpageform.save()
            if formset.is_valid():
                formset.save()
            return HttpResponseRedirect(reverse(consult_categories))
    else:
        textpageform = TextPageForm(instance=textpage, prefix='page')
        formset = PageFormSet(instance=textpage, prefix='paragraphs')
    return render_to_response('textpages/manage.html', { 'formset' : formset,
                                                         'textpageform' : textpageform,
                                              }, context_instance=RequestContext(request))

我知道发布您甚至不希望工作的代码是一种代码猴子风格,但我想展示我正在尝试完成的工作。这是models.py的相关部分:

class TextPage(models.Model):
    title = models.CharField(max_length=100)
    page_sub_category = models.ForeignKey(PageSubCategory, blank=True, null=True)

    def __unicode__(self):
        return self.title

class Paragraph(models.Model):
    article = models.ForeignKey(TextPage)
    title = models.CharField(max_length=100, blank=True, null=True)
    text = models.TextField(blank=True, null=True)

    def __unicode__(self):
        return self.title

任何帮助将不胜感激。谢谢!

更新。添加了实例引用,但仍然不起作用 - 导致此字符串出现 ValidationError:

formset = PageFormSet(request.POST, instance=textpage, prefix='paragraphs') 

有什么想法吗?

【问题讨论】:

  • 我想帮忙,但我想我没有一个好的答案。如果您没有得到任何答案并以某种方式弄清楚,您介意发布答案吗?

标签: django models django-forms django-validation


【解决方案1】:

带有实例引用的更新代码实际上可以正常工作!问题出在模板中:我忘记了 ManagmentForm。这是模板代码:

{% extends "site_base.html" %}
{% block body %}
<form action="" method="post">
{{ textpageform.as_p }}
{{ formset.management_form }}
{% for form in formset.forms %}
    <p>{{ form.as_p }}</p>
{% endfor %}
<input type="submit" value="Go" />
{% endblock %}

希望这个例子能帮助像我这样的新手:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多