【问题标题】:How to send a success message with get_success_url() in Django FormView如何在 Django FormView 中使用 get_success_url() 发送成功消息
【发布时间】:2016-06-04 17:56:21
【问题描述】:

如果表单有效,我有FormView 重定向到上一页。这很好,但我如何告诉用户信息已发布?我希望他在重定向后在模式窗口中看到成功消息。

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

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

【问题讨论】:

标签: django-forms django-class-based-views


【解决方案1】:

为此使用 Django 消息传递框架,将 get_success_url 更改为消息。

from django.contrib import messages
def get_success_url(self):
    messages.add_message(self.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 %}

【讨论】:

  • 请求对象在 get_success_url 中不可用
  • 使用self.request«编辑必须至少6个字符»
【解决方案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'
    ...

非常简洁明了。

【讨论】:

  • 这不是一个正确的答案:问题是关于使用messages 使用get_success_url() 方法。 success_message 在这个用例中看起来像忽略
【解决方案3】:
def get_success_url(self):
    from django.contrib import messages
    messages.success(self.request, 'Yes it works!')

【讨论】:

    【解决方案4】:

    这样就可以了

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-15
      • 2014-08-19
      • 2011-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多