Django ListView: как показать несколько записей и защитить остальные

У меня есть модель с небольшим количеством записей. Я хотел бы показать только некоторые из них и защитить остальные... пример:

class Squadra(models.Model):
    ...
    tipo = models.IntegerField(choices=TIPO_SQUADRA, default=1)
    ...

Затем у меня есть ListView, который возвращает только несколько объектов Squadra, используя фильтр:

all_squadre = Squadra.objects.filter(tipo=3)

и файл url, включающий следующее:

    path('squadra_table/<int:squadra>/', views.SquadraTableListView.as_view() ),

Моя проблема в том, что кто-то может попасть на страницу Squadra, а затем попытаться произвольно изменить ID <int:squadra> в url и получить доступ к другим записям, которые я хотел бы сохранить защищенными... Как я могу это сделать?

Спасибо за помощь

Аттилио

В вашем ListView используйте queryset = Squadra.objects.filter('…') вместо model = Squadra и выберите строку внутри filter(), которая соответствует вашим потребностям. Для более глубокого объяснения вместе с примерами эта тема рассматривается здесь в документации: Просмотр подмножеств объектов.

Для защиты вашего представления вам нужно переопределить метод dispatch и поместить некоторую логику, основанную на вашей потребности, например :

class ProtectedView(TemplateView):
    template_name = 'secret.html'


    def dispatch(self, request, *args, **kwargs):
        entity = get_object_or_404(Entity, pk=args[0])
      if not check_permission(request, entity):
       raise Http404
      return super(MyView, self).dispatch(request, *args, **kwargs)
Вернуться на верх