Reputation: 1298
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?
Upvotes: 4
Views: 3008
Reputation: 1298
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 :)
Upvotes: 2