2009-12-11 9 views
3

Dans un scénario de soumission de formulaire, le formulaire est envoyé à "/ submit". Je veux rediriger l'utilisateur vers "/ sucess" en cas de succès et transmettre un message à un template à la nouvelle URL. Comment faire cela dans Django? render_to_response ne fait pas de redirection et HttpResponseRedirect ne fait pas de rendu de template.Rendu de la réponse à une URL redirigée dans Django

+0

Je suppose que HttpResponseRedirect dit le client de rediriger? La page redirigée ne serait-elle pas responsable du rendu? En outre, que se passe-t-il si quelqu'un va manuellement à votre/page de succès? –

Répondre

3

Si votre page de réussite a besoin d'un message dynamique, vous devez la transmettre d'une manière ou d'une autre. Vous pouvez soit le faire via les paramètres GET dans l'URL que vous redirigez vers - par exemple return HttpResponseRedirect('/success/?msg=My+success+message+here') - soit en définissant des valeurs dans la session, ce que la vue de réussite peut prendre en compte.

0

Il n'y a pas de bonne façon de faire ce que vous voulez. Le navigateur soumet le formulaire, ce qui amène l'utilisateur à/soumettre. Une fois que vous décidez si c'est "réussi", il est trop tard; le navigateur a déjà décidé de sa destination. Tout ce que vous pouvez faire est de rediriger. Mais, comme vous le savez, il sera difficile de garder votre état POST lorsque vous redirigez.

J'abandonnerais ça. Ce n'est pas la façon dont les sites Web sont censés fonctionner.

9

La réponse de Daniel Roseman est potentiellement dangereux, ouvrant votre site aux vulnérabilités XSS.

Assurez-vous de supprimer les balises html de tout message passé si vous devez le faire de cette façon.

Une meilleure façon serait de rediriger vers/succès/msg = ok, et d'avoir à votre avis un dictionnaire:

{ 'ok': 'Your success message' } 
0

Je pense que Django le fait déjà si vous prolongez le generic view. A la création, il y a un argument optionnel "post_save_redirect". Cette fonctionnalité est utilisée dans le système d'administration Django généré automatiquement. Par exemple si vous voulez une nouvelle ressource, dites utilisateur, vous allez à l'url "/ user/add". Une fois que vous l'avez envoyé, il vous redirige vers "/ user/1" avec un message de réussite "Vous venez de sauvegarder l'utilisateur n ° 1". Donc, c'est possible, mais je suis toujours en train de chercher comment le faire sans étendre la vue générique. Je suis encore très jeune avec Django et python, donc regarder à travers le noyau de Django pour trouver comment ils l'ont fait n'est pas si facile pour moi.

1

La meilleure façon de faire ce que vous voulez est: Dans votre vue, définissez le message de réussite (ou le message d'erreur) comme dict. Et utilisez le render_to_response pour afficher n'importe quel modèle.

Dans votre modèle, vous pouvez vérifier s'il y a un message et si le message est un message d'erreur ou un message de réussite.

Certains comme ceci: Selon vous:

if anyError: 
    dict = {"message" : {"error" : "The error message"}} 
else: 
    dict = {"message" : {"success" :"The success message"}} 

dans votre modèle:

{% if message %} 
     {% if message.error %} 
     {{ message.error }} 
     {% else %} 
     {{ message.success }} 
     {% endif %} 
    {% endif %} 

espoir que je l'ai aidé

Questions connexes