如何在django中的FormView中的get_success_url中重定向和返回消息

时间:2016-06-04 17:56:22

标签: django formview

如果表单有效,我已将FormView重定向到上一页。这工作正常,但我怎么能告诉用户信息已经发布?我希望他在重定向后在模态窗口中看到成功消息。

我尝试通过request.session中的get_success_url进行此操作,但它不符合我的目标,因为用户可以多次提交表单。那么如何在get_success_url中的FormView中返回任何带有重定向的邮件?

我的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)

4 个答案:

答案 0 :(得分:2)

为此目的使用Django消息传递框架,使用消息更改get_success_url

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'],))

在您的模板中,类似这样的内容(注意:记得传递消息)

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

答案 1 :(得分:2)

事实上,Django已经准备好使用mixin SuccessMessageMixin,它可以在基于类的视图中使用,以实现相同的目的。

像这样:

from django.contrib.messages.views import SuccessMessageMixin

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

非常干净和直白。

答案 2 :(得分:1)

def get_success_url(self):
    from django.contrib import messages
    messages.success(self.request, 'Yes it works!')

答案 3 :(得分:0)

这将完成工作

def form_valid(self, form):
    print(self.request.POST)
    form.save()
    messages.add_message(
        self.request,
        messages.SUCCESS,
        'User registered sucessfully'
    )
    return super().form_valid(form)