views:

252

answers:

1

UPDATE The issue is solved, all the code you can see works.

Hello!

I have a ForeignKey relationship between TextPage and Paragraph and my goal is to make front-end TextPage creating/editing form as if it was in ModelAdmin with 'inlines': several fields for the TextPage and then a couple of Paragraph instances stacked inline. The problem is that i have no idea about how to validate and save that:

@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))

I know it's a kind of code-monkey style to post code that you don't even expect to work but I wanted to show what I'm trying to accomplish. Here is the relevant part of 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

Any help would be appreciated. Thanks!

UPDATE. Instance references added, but still doesn't work - results in a ValidationError on this string:

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

Any ideas?

+1  A: 

The updated code with instance references actually works fine! The problem was in the template: I forgot the ManagmentForm. Here is the template code:

{% 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 %}

Hope this example helps newbies like me :)

martinthenext