В Django ограничьте представление пользователя, используя представления на основе классов

У меня есть такой шаблон url:

path("user/<int:pk>", MyAccountView.as_view(), name='my_account'),

А это мнение:

class MyAccountView(DetailView):

    model = CustomUser

Когда пользователь вошел в систему, Django перенаправляет его на этот URL.

Проблема в том, что любой пользователь может получить доступ к другим пользователям.

Например, если зарегистрированный пользователь имеет пк 25, он может получить доступ к представлению пользователя с пк 26, написав в поле url браузера:

localhost:8000/user/26

Я хочу, чтобы каждый пользователь мог получить доступ только к своей пользовательской странице, поэтому если пользователь с pk 25 попытается получить доступ к url с pk 26, доступ должен быть запрещен.

Можете ли вы указать мне на то, как это делается? Документация Django очень запутанна в этом отношении.

Спасибо.

Вам необходимо переопределить метод get из DetailView

from django.core.exceptions import PermissionDenied
from django.contrib.auth.mixins import LoginRequiredMixin

class MyAccountView(LoginRequiredMixin, DetailView):

    model = CustomUser

    def get(self, request, pk):
        if request.user.pk != pk:
            raise PermissionDenied()
        self.object = self.get_object()
        context = self.get_context_data(object=self.object)
        return self.render_to_response(context)
   

Легко!

  1. Сначала измените путь представления с user/<int:pk>/ на user/
  2. .
  3. Свяжите представление с current user, DetailView не будет работать, потому что оно сильно зависит от pk или slug, а мы не будем использовать ни одно из них, поэтому вам придется написать новое представление. (Пример с использованием FBV, потому что я не использую CBV)
# views.py

from django.contrib.auth.decorators import login_required

# redirects to login page if the user is not authenticated
@login_required(login_url='/example url you want redirect/') 
def get_user_profile(request):
    context = dict(user=request.user)
    return render(request, "template.html", context)

И все, любой пользователь, посетивший /user/, увидит только свою учетную запись/профиль.

Вернуться на верх