2010-04-01 6 views
4

MISE À JOUR Le problème est résolu, tout le code que vous pouvez voir fonctionne.Un formulaire pour deux modèles

Bonjour! J'ai une relation ForeignKey entre TextPage et Paragraph et mon but est de faire un formulaire de création/modification de TextPage frontal comme s'il était dans ModelAdmin avec 'inlines': plusieurs champs pour la TextPage et ensuite quelques instances de Paragraph empilé en ligne. Le problème est que je n'ai aucune idée sur la façon de valider et enregistrer que:

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

Je sais qu'il est une sorte de style de code singe pour écrire le code qui vous ne vous attendez même pas à travailler mais je voulais montrer ce que j'essaie d'accomplir. Voici la partie pertinente de 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 

Toute aide serait appréciée. Merci!

MISE À JOUR. références d'instance ajouté, mais ne fonctionne toujours pas - les résultats dans un ValidationError sur cette chaîne:

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

Toutes les idées?

+0

Je voudrais aider, mais je ne pense pas avoir une bonne réponse. Si vous n'obtenez aucune réponse et que vous ne vous en apercevez pas, cela vous dérangerait-il de poster la réponse? –

+0

bien sûr, je vais :) – martinthenext

Répondre

2

Le code mis à jour avec des références d'instance fonctionne réellement bien! Le problème était dans le template: j'ai oublié le ManagmentForm. Voici le code du modèle:

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

espère que cet exemple aide les débutants comme moi :)

Questions connexes