Одна форма для двух моделей - PullRequest
4 голосов
/ 02 апреля 2010

ОБНОВЛЕНИЕ Проблема решена, весь код, который вы видите, работает.

Здравствуйте! * * 1005

У меня есть отношение ForeignKey между TextPage и Paragraph, и моя цель состоит в том, чтобы создать внешнюю форму 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

Любая помощь будет оценена. Спасибо!

UPDATE . Добавлены ссылки на экземпляры, но они по-прежнему не работают - ошибка ValidationError в этой строке:

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

Есть идеи?

1 Ответ

2 голосов
/ 03 апреля 2010

Обновленный код со ссылками на экземпляры на самом деле работает отлично! Проблема была в шаблоне: я забыл 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 %}

Надеюсь, этот пример поможет таким новичкам, как я:

...