2010-10-27 6 views
1

J'utilise django pour générer un pdf et renvoyer la réponse en pièce jointe dans la vue.Sortie de PDF avec Django en pièce jointe et rechargement

response = HttpResponse(mimetype='application/pdf') 
response['Content-Disposition'] = 'attachment; filename=somefilename.pdf' 

similaire à la manière décrite dans la doc (http://docs.djangoproject.com/en/dev/howto/outputting-pdf/#write-your-view)

Quelle est la meilleure façon de recharger la page?

Ce didnt fonctionne sur (la forme déclenche la génération pdf):

$('#the_form').submit(function(){ 
    location.reload(); 
}); 

Merci beaucoup, Danny

Répondre

1

Ne pas recharger. Au lieu de cela créer une vue qui est la cible du formulaire. La vue génère le fichier PDF dans un répertoire fourni à partir du serveur Web réel, puis envoie l'utilisateur à l'URL appropriée, où il peut télécharger le fichier (utilisez HttpResponseRedirect).

+0

Merci Martin. C'est une bonne alternative. Est-il toujours possible de renvoyer le PDF en pièce jointe? –

+0

J'ai décidé de mettre en œuvre l'approche proposée par Martin. Merci. –

0

Définissez simplement la cible des formulaires sur la vue qui génère le fichier PDF. Ci-dessous j'inclus quelques avantages et les inconvénients de cette approche vs l'approche proposée par Martin (pour écrire des fichiers dans un répertoire le monde peut lire)

Plus:

  • Vous pouvez faire la facturation d'authentification ou spéciale ou quoi que
  • Chaque demande générera un nouveau PDF (à moins que vous mettre en cache explicitement)

moins:

  • Chaque demande générera un nouveau PDF
  • Utilisation de la mémoire
  • Vous devez diffuser un fichier de Django

-

Une autre solution serait d'utiliser l'en-tête X-SendFile de votre serveur Web. Faites une recherche google pour les instructions pour votre serveur particulier. L'idée générale est que votre vue donne au serveur web un chemin vers un fichier que le serveur web lira directement depuis le disque et retournera à l'utilisateur. Vous pouvez probablement "forcer le téléchargement", même ces fichiers, jetez un oeil à la documentation de votre serveur Web sur la façon de le faire.

+0

Je suis en train d'envoyer la cible du formulaire à la vue qui génère le pdf et obtient la pièce jointe en guise de réponse. def some_view(request): response = HttpResponse(mimetype='application/pdf') response['Content-Disposition'] = 'attachment; filename=somefilename.pdf' \t ... return response Mais la page ne se rechargera pas une fois la réponse renvoyée. –

+0

Aha. Je vois. Eh bien, quand vous faites des choses sur le formulaire soumettre avec javascript, ce sera exécuté avant que le formulaire est effectivement soumis, de sorte que vous ne pouvez pas faire de rechargement ou redirige là. La solution la plus simple que je peux trouver est d'appeler window.setTimeout (function() {window.location = '/ your/url /'}, timeout_in_millisecondes) dans le gestionnaire de soumission, mais c'est vraiment un bidouillage plutôt moche. – knutin