2016-06-04 2 views
1

J'ai FormView qui rediriger vers une page précédente si le formulaire était valide. Cela fonctionne bien mais comment puis-je dire à un utilisateur que l'information a été postée? Je veux qu'il voit un message de réussite dans une fenêtre modale après la redirection.comment rediriger et retourner un message dans get_success_url dans FormView dans django

J'ai essayé de le faire par request.session dans get_success_url mais il ne correspond pas à mes objectifs, car un utilisateur peut soumettre le formulaire plusieurs fois. Alors, comment puis-je retourner un message avec la redirection dans get_success_url dans FormView?

Mon FormView

class CatPhotoUploadFormView(FormView): 
    template_name = 'blank.html' 
    form_class = CatPhotoForm 

    def get_success_url(self): 
     self.request.session['success_message'] = 'Everything is fine' 
     return reverse('cat:detail_cat', args=(self.kwargs['pk'],)) 

    def form_valid(self, form): 
     cat = Cat.objects.filter(id__exact=self.kwargs['pk']) 
     for each in form.cleaned_data['attachments']: 
      print('****', each, '****', type(each)) 
      Photo.objects.create(photo_path=each, photo_author=self.request.user, photo_cat = cat[0]) 
     return super(CatPhotoUploadFormView, self).form_valid(form) 
+0

Avez-vous envisagé d'utiliser le [framework de messagerie] de Django (https://docs.djangoproject.com/fr/1.9/ref/contrib/messages/)? – Ben

Répondre

2

Utiliser cadre de messagerie Django à cet effet, changer get_success_url avec le message.

from django.contrib import messages 
def get_success_url(self): 
    messages.add_message(request, messages.INFO, 'form submission success') 
    return reverse('cat:detail_cat', args=(self.kwargs['pk'],)) 

Dans votre modèle, quelque chose comme ceci (REMARQUE: rappelez-vous de transmettre des messages)

{% if messages %} 
<ul class="messages"> 
    {% for message in messages %} 
    <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li> 
    {% endfor %} 
</ul> 
{% endif %} 
1

En fait Django a un prêt à l'emploi mixin, SuccessMessageMixin, qui peut être utilisé dans des vues sur la base de classe à atteindre le même but.

Comme si:

from django.contrib.messages.views import SuccessMessageMixin 

class CatPhotoUploadFormView(SuccessMessageMixin, FormView): 
    template_name = 'blank.html' 
    form_class = CatPhotoForm 
    success_message = 'Everything is fine' 
    ... 

Très propre et simple.