J'ai une page avec un formulaire POST, qui contient une action définie sur une URL.
Je suppose que l’URL de cette page est /form_url/
: ...__
La vue dans /submit_url/
prend en charge les données du formulaire. Ensuite, je souhaite renvoyer la même page du formulaire avec un message de succès . Dans la vue qui prend en charge le formulaire POST, j'utilise HttpResponseRedirect
, afin "d'effacer" les données du formulaire de le navigateur . Mais de cette façon, je ne peux pas afficher un message dans la page de formulaire, sauf si je fais quelque chose comme:
return HttpResponseRedirect("/form_url/?success=1")
puis recherchez ce paramètre dans le modèle. Je n'aime pas cette façon, car si l'utilisateur rafraîchit la page, il verra toujours le message de réussite.
J'ai remarqué que sur le site d'administration Django, la suppression/l'ajout d'objets utilise la redirection après l'envoi de POST, et affiche quand même un message de réussite. Comment?
J'ai déjà brièvement vu l'application de "messagerie" de Django, mais je veux savoir comment cela fonctionne en premier ..
L'administrateur Django utilise Django.contrib.messages
, vous l'utilisez comme ceci:
A votre avis:
from Django.contrib import messages
def my_view(request):
...
if form.is_valid():
....
messages.success(request, 'Form submission successful')
Et dans vos modèles:
{% if messages %}
<ul class="messages">
{% for message in messages %}
<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
Django messages Framework stocke les messages dans la session ou le cookie (cela dépend du backend storage ).
Vous n'avez pas besoin de faire une redirection pour effacer les données du formulaire. Tout ce que vous avez à faire est de ré-instancier le formulaire:
def your_view(request):
form = YourForm(request.POST or None)
success = False
if request.method == 'POST':
if form.is_valid():
form.save()
form = YourForm()
success = True
return render(request, 'your_template.html', {'form': form})
Si l'utilisateur actualise la page, il va lancer une demande GET et success
sera False
. Dans les deux cas, le formulaire ne sera pas lié à un GET ou à un POST réussi.
Si vous utilisez le cadre messages , vous devrez toujours ajouter une condition dans le modèle pour afficher les messages s'ils existent ou non.
from Django.contrib.messages.views import SuccessMessageMixin
from Django.views.generic.edit import CreateView
from myapp.models import Author
class AuthorCreate(SuccessMessageMixin, CreateView):
model = Author
success_url = '/success/'
success_message = "%(name)s was created successfully"
https://docs.djangoproject.com/fr/1.11/ref/contrib/messages/