【问题标题】:Django: Messages not being displayedDjango:消息未显示
【发布时间】:2017-10-08 03:41:32
【问题描述】:

我具有以下功能,可对 ListView 中的选定行进行批量操作。 我正在显示成功和错误的消息。

def archive_stores(view, queryset):
    if queryset.exists():
        queryset.update(archive=True)
        success_message = messages.success(view.request, 'Archived successfully.')
        return HttpResponseRedirect(reverse('stores_list', success_message))
    else: #The message is not shown when queryset of empty.
        error_message = messages.error(view.request, 'No success!.')
        return HttpResponseRedirect(reverse_lazy('stores_list', error_message))

成功消息正在正确显示。但错误消息永远不会出现。请指导我可能是什么原因?

下面是ListView:

@method_decorator(login_required, name='dispatch')
class StoresListView(ActionViewMixin,ListFilteredMixin,ListView):
    template_name = 'stores_listing.html'
    model = Store
    filter_set = StoreFilter
    actions = [archive_stores, unarchive_stores, delete_stores, export_stores,]
    paginate_by = 25

以下是消息模板:

{% for message in messages %}
  <div class="alert {{ message.tags }} alert-dismissible" role="alert">
    <button type="button" class="close" data-dismiss="alert" aria-label="Close">
      <span aria-hidden="true">&times;</span>
    </button>
    {{ message | safe }}
  </div>
{% endfor %}

谢谢。

【问题讨论】:

  • 你能显示视图吗?
  • 用视图更新了问题。请注意我正在使用:django_actions 包,用于在 ListView 中生成类似管理员的操作。
  • 对不起,我的意思是,模板 *
  • 您希望我发布模板的哪一部分,仅用于显示消息或所有内容的模板?
  • 我通过在 django_actions 包中进行更改来修复它。我在包的 view.py 中进行了更改。

标签: django django-messages


【解决方案1】:

试试这个:

   def archive_stores(view, queryset):
      if queryset:
        queryset.update(archive=True)
        success_message = messages.success(view.request, 'Archived successfully.')
        return  HttpResponseRedirect(reverse('stores_list', success_message))
      else: #The message is not shown when queryset of empty.
         error_message = messages.error(view.request, 'No success!.')
         return HttpResponseRedirect(reverse_lazy('stores_list', error_message))

而且我认为您不必明确地将消息作为 kwarg 反向传递,因为单独调用 message.success() 或 message.error() 将包含所需的消息。您可以像这样更新您的视图:

   def archive_stores(view, queryset):
      if queryset:
        queryset.update(archive=True)
        messages.success(view.request, 'Archived successfully.')
        return  HttpResponseRedirect(reverse('stores_list'))
      else: #The message is not shown when queryset of empty.
         messages.error(view.request, 'No success!.')
         return HttpResponseRedirect(reverse_lazy('stores_list'))

【讨论】:

  • 我试过这个。我不知道为什么 else 部分中的 Message 永远不会执行。
  • 是否尝试打印查询集以确保其为空?
  • 我尝试使用 :print('I am in else') print(queryset) 打印到控制台。什么都没有打印出来。我猜它曾经进入 else 部分。
  • 当预期为空时,尝试在 if 部分打印查询集。
  • 是的。即使在 if 部分它也不会打印任何东西。
猜你喜欢
  • 2012-08-03
  • 2021-07-09
  • 2014-01-29
  • 1970-01-01
  • 2015-12-12
  • 1970-01-01
  • 2018-05-30
  • 2013-09-27
  • 1970-01-01
相关资源
最近更新 更多