4

更新問題は解決されました。表示されるすべてのコードが機能します。

こんにちは!

TextPage と Paragraph の間に ForeignKey 関係があり、私の目標は、フロントエンドの TextPage を作成/編集するフォームを ModelAdmin に「インライン」であるかのように作成することです: 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') 

何か案は?

4

1 に答える 1

2

インスタンス参照を含む更新されたコードは、実際には正常に動作します! 問題はテンプレートにありました。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 %}

この例が私のような初心者に役立つことを願っています:)

于 2010-04-02T20:11:40.763 に答える