Как ограничить удаление не-суперпользователей с помощью Django CBV?

Я использую представление на основе функций, которое ограничивает любой users, кроме superuser, чтобы удалить что-то и направить пользователя на ту же страницу site-list независимо от того, ограничен пользователь или нет. Это прекрасно работает. Вот этот рабочий код:

@login_required
def delete_site(request, pk):

    site = TargetSite.objects.filter(primary_key=pk).first()    

    if request.method == 'POST' and request.user.is_superuser:
        site.delete()
        messages.success(request, f'Successfully deleted "{site.site_name}" ', extra_tags='check')
        return redirect('site-list', project=site.project)
    else:
        messages.warning(request, f'Sorry, you\'re not authorized to execute this request', extra_tags='exclamation')
        return redirect('site-list', project=site.project)

Однако, когда я попробовал CBV, он не работает так же, как функция на основе. non-superuser может удалять и не ограничивается:

class SiteDeleteView(LoginRequiredMixin, UserPassesTestMixin, DeleteView):
    model = TargetSite

    def test_func(self):
        site = self.get_object()

        if not self.request.user.is_superuser:
            messages.warning(self.request, f'Sorry, you\'re not authorized to execute this request', extra_tags='exclamation')
            return reverse('site-list', kwargs={'project': site.project})
        return True

    def get_success_url(self):
        messages.success(self.request, f'Successfully deleted "{ self.object.site_name}" ', extra_tags='check')
        return reverse('site-list', kwargs={'project': self.object.project})

Я также пробовал этот вариант с test_func(self), но он просто выбрасывает сообщение 403 Forbidden и не направляет пользователя на ту же site-list страницу. Мне кажется, я что-то упускаю. Не могли бы вы помочь?

def test_func(self):       
    if self.request.user.is_superuser:
         return True
    return False

Используйте метод отправки для CBV

# Inside your class SiteDeleteView
def dispatch(self, *args, **kwargs):
    if not self.request.user.is_superuser:
        messages.warning(self.request, f'Sorry, you\'re not authorized to execute this request', extra_tags='exclamation')
        return reverse('site-list', kwargs={'project': site.project})
    # If it is a superuser continue with the dispatch
    return super().dispatch(request, *args, **kwargs)
Вернуться на верх