2011-02-06 4 views
5

J'ai un formulaire simple, qui, lorsqu'il est envoyé redirige vers une page de succès.django - transmettre des informations lors de la redirection après POST

Je veux être en mesure d'utiliser les données qui ont été soumises à l'étape précédente, dans ma page de réussite. Autant que je sache, vous ne pouvez pas transmettre des données POST lors de la redirection, alors comment y parvenez-vous?

Pour l'instant, je dois juste retourner directement la page de succès de la même URL, mais cela provoque la rediffusion redoutée des données lors de l'actualisation.

Utilise le request.session le seul moyen d'y aller?

+0

Tout mécanisme qui vous permet de persistez les données entre les requêtes fera (puisque c'est à la fin ce que vous demandez). La session est probablement la plus simple, mais certainement pas la seule. –

Répondre

7

Vous pouvez:

  1. passer les données (soit des données complètes ou simplement id objet) dans request.session
  2. Redirect avec quelque chose comme id = [id] dans l'URL - où [id]? pointe vers votre objet.

Mise à jour:

En ce qui concerne pt. 1 ci-dessus, je voulais dire que vous pourriez faire (dans le gestionnaire POST):

my_object = MyModel.objects.create(...) 
request.session['my_object_id'] = my_object.id 

Ou vous pouvez essayer de passer tout l'objet (il devrait fonctionner mais je ne suis pas sûr à 100%):

my_object = MyModel.objects.create(...) 
request.session['my_object'] = my_object 
+0

De quel objet parlez-vous? Existe-t-il un objet contenant les données POST pouvant être évaluées? – Acorn

+0

Oui, il est nommé request.POST.data –

+0

Mais quand je redirige, la page n'aura pas accès aux données POST le sera-t-il? – Acorn

8

Je fais cela tout le temps, pas besoin d'un objet de session. C'est un modèle très commun POST-redirect-GET. En général ce que je fais est:

  1. ont une vue avec liste d'objets et un formulaire pour publier des données
  2. affichage avec succès à cette forme enregistre les données et génère une redirection vers le détail de l'objet vue

De cette façon, vous économisez sur POST et rediriger après l'enregistrement.

Une vue par exemple, en supposant un modèle de bidules:

def all_thingies(request, **kwargs): 
    if request.POST: 
     form = ThingieForm(request.POST) 
     if form.is_valid(): 
      thingie = form.save() 
      return HttpResponseRedirect(thingie.get_absolute_url()) 
    else: 
     form = ThingieForm() 
    return object_list(request, 
         queryset = Thingie.objects.all().order_by('-id'), 
         template_name = 'app/thingie-list.html', 
         extra_context = { 'form': form }, 
         paginate_by = 10) 
+0

+1: Je n'ai pas compris que Acorn pourrait juste vouloir rediriger vers la page de détails de l'objet :-) –

+0

La chose est, ma page ne soumet pas à une base de données, il envoie un message sur l'Internet, donc il n'y a pas de page pertinente pour moi de rediriger vers. – Acorn

+0

@Acorn Eh bien, au lieu d'enregistrer l'envoi, puis rediriger vers la page de succès que vous avez mentionné dans votre question –

Questions connexes