2015-10-09 2 views
1

Je souhaite soumettre deux formulaires dans mon modèle. La raison en est, que j'ai deux modèles distincts, chacun avec une forme de modèle, que je dois présenter en même temps pour créer le résultat souhaité:Utiliser deux formulaires en même temps

Je ces deux formes:

class BootstrapModelForm(ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(BootstrapModelForm, self).__init__(*args, **kwargs) 
     for field in iter(self.fields): 
      self.fields[field].widget.attrs.update({ 
       'class': 'form-control' 
      }) 

class DeckForm(ModelForm): 
    class Meta: 
     model = Deck 
     exclude = ('dust',) 

class GuideForm(BootstrapModelForm): 
    class Meta: 
     model = Guide 
     exclude = ('author', 'upvotes', 'downvotes', 'release_date', 'modified', 'deck') 

    def __init__(self, *args, **kwargs): 
     super(GuideForm, self).__init__(*args, **kwargs) 
     self.fields['title'].label = 'Title of your AWESOME Guide!' 
     self.fields['public'].label = 'Check, when you want to make your guide public' 
     self.fields['public'].widget.attrs.update({ 
      'class': 'checkbox' 
     }) 
     self.fields['introduction'].label = 'Introduction (not required, but recommended)' 

Un jeu fait partie du Guide créé. Depuis l'utilisateur devrait être en mesure de créer son propre pont en écrivant son guide, j'ai besoin de deux formes.

Dans mon point de vue je manipulaient comme ceci:

def guide_create(request): 
    if request.method == "POST": 
     deck_form = DeckForm(request.POST) 
     guide_form = GuideForm(request.POST) 
     if guide_form.is_valid() and deck_form.is_valid(): 
      new_deck = deck_form.save(commit=False) 
      new_deck.dust = 0 
      new_deck.save() 

      new_guide = deck_form.save(commit=False) 
      new_guide.author = Account.objects.get(id=request.user.id) 
      new_guide.deck = Deck.objects.get(id=new_deck.id) 
      new_guide.save() 
     else: 
      print(guide_form.errors) 
      print(deck_form.errors) 
    else: 
     deck_form = DeckForm(prefix = 'DeckForm') 
     guide_form = GuideForm(prefix = 'GuideForm') 

    return render(request, 'hsguides/guide_create.html', { 
     'DeckForm': DeckForm, 
     'GuideForm': GuideForm, 
    }) 

J'utilise commit=False donc je ne peux toujours insérer le pont dans mon guide. Maintenant, mon problème vient avec la création du modèle. Lorsque je soumets les formulaires avec ma configuration actuelle, je ne reçois plus d'erreurs mais le guide et le deck ne sont pas sauvegardés non plus!

<div style="width: 60%; margin: 0 auto;"> 

    <form class="form-horizontal" method="POST" action="{% url 'GuideCreate' %}"> {% csrf_token %} 
    <fieldset> 
     {% for field in DeckForm %} 
     {% if field.errors %} 
      <div class="class-group error"> 
      <label class="control-lable">{{ field.label }}</label> 
      <div class="controls">{{ field }} 
       <span class="help-inline"> 
       {% for error in field.errors %}{{ error }}{% endfor %} 
       </span> 
      </div> 
      </div> 
     {% else %} 
      <div class="control-group"> 
      <label class="control-label">{{ field.label }}</label> 
      <div class="controls">{{ field }}</div> 
      </div> 
     {% endif %} 
     {% endfor %} 
    </fieldset> 


    <fieldset> 
     {% for field in GuideForm %} 
     {% if field.errors %} 
      <div class="class-group error"> 
      <label class="control-lable">{{ field.label }}</label> 
      <div class="controls">{{ field }} 
       <span class="help-inline"> 
       {% for error in field.errors %}{{ error }}{% endfor %} 
       </span> 
      </div> 
      </div> 
     {% else %} 
      <div class="control-group"> 
      <label class="control-label">{{ field.label }}</label> 
      <div class="controls">{{ field }}</div> 
      </div> 
     {% endif %} 
     {% endfor %} 
    </fieldset> 

    <div class="form-actions" style="margin-top: 4px;"> 
     <button type="submit" class="btn btn-default">Submit</button> 
    </div> 

    </form> 
</div> 

Modifier Je ne reçois pas de message d'erreur plus, la plate-forme est créé ainsi, mais le guide qui lui appartient pas.

+0

Pouvez-vous dans le modèle déplacer tout le code dans le deuxième formulaire à la fin du premier '

' et supprimer le second ''? Vous n'avez pas besoin de soumettre 2 '', il suffit de mettre tous les champs dans un formulaire et de le soumettre? Mais comme @doniyor l'a fait remarquer, vous devriez nourrir vos 2 formulaires avec 'request.POST'. –

+0

Vous dites que le guide n'est pas créé. Je vois cette ligne 'new_guide = deck_form.save (commit = False)' ..... ne devrait-il pas être 'new_guide = guide_form.save (commit = False)'? Pas 100% mais cela pourrait être une erreur. Heureusement, ce n'est pas seulement parce que vous avez refaçonné le code pour le mettre ici. –

+0

@ vlad-ardelean nope, qui était en fait juste .. Je suis si aveugle ... Vous pouvez poster que la réponse: D –

Répondre

1

Vous dites que le guide ne soit pas créé. Je vois cette ligne new_guide = deck_form.save(commit=False) ..... ne devrait-elle pas être new_guide = guide_form.save(commit=False)? Pas 100% mais cela pourrait être une erreur. Heureusement, ce n'est pas seulement parce que vous avez refaçonné le code pour le mettre ici.

1

Je didnot vérifier la chose, mais cet endroit est faux, il devrait être:

if request.method == "POST": 
    deck = DeckForm(request.POST) 
    if deck.is_valid(): 
     # .... 

vous n'êtes pas emballer les données POST dans vos formulaires ..

va de même pour la deuxième forment ainsi

+0

toujours la même erreur –

1

Essayez, vous pourriez oublié de passer le RequestContext:

from django.template import RequestContext 

return render_to_response('hsguides/guide_create.html', 
          {'DeckForm': DeckForm, 'GuideForm': GuideForm}, 
          RequestContext(request)) 

Il transmet le jeton csrf au modèle.

+0

Hm, ne fonctionne pas:/ –

+0

-t-il toujours le même Erreur? –

+0

Malheureusement oui –

2

Just Change

return render_to_response('hsguides/guide_create.html', { 
    'DeckForm': DeckForm, 
    'GuideForm': GuideForm, 
}) 

à

return render(request,'hsguides/guide_create.html', { 
    'DeckForm': DeckForm, 
    'GuideForm': GuideForm, 
}) 
+0

Toujours la même erreur –