Django PermissionRequiredMixin 重定向到带有消息的登录模板

Django PermissionRequiredMixin redirect to login template with message

我得到了这个视图,我在上面使用 PermissionRequiredMixin...它工作正常,但是当我重定向到登录模板(在设置 LOGIN_URL 中设置)时,我需要它显示一条消息那里像 "You don't have permission to do this"。知道如何在不创建自定义装饰器的情况下做到这一点,只使用 PermissionRequiredMixin 本身吗?

from django.contrib.auth.mixins import PermissionRequiredMixin

class MyView(PermissionRequiredMixin,View):

    template = 'myapp/item_detail.html'
    permission_required = 'myapp.change_item'


    def get(self, request, *args, **kwargs):
        #Query here
        return render(request, self.template)

我需要添加什么才能实现这一目标?

你可以试试这个方法:

  1. 在您的视图中覆盖 handle_no_permission(self)
from django.contrib import messages
from django.contrib.auth.mixins import PermissionRequiredMixin

class MyView(PermissionRequiredMixin,View):
    
    template = 'myapp/item_detail.html'
    permission_required = 'myapp.change_item'

    def handle_no_permission(self):
        messages.error(self.request, 'You don't have permission to do this')
        return super(MyView, self).handle_no_permission()
  1. 确保登录模板中的 messages are visibledjango.contrib.messages 添加到 INSTALLED_APPS

你应该使用 the messaging framework。要添加您自己的消息,只需覆盖:

from django.contrib import messages

class MyView(...):
    ...

    def handle_no_permission(self):
        # add custom message
        messages.error(self.request, 'You have no permission')
        return super(MyView, self).handle_no_permission()

您还需要将以下内容添加到您的 base.html(或登录表单):

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