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)