Как ограничить удаление не-суперпользователей с помощью 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)