В 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)
Легко!
- Сначала измените путь представления с
user/<int:pk>/
наuser/
.
- Свяжите представление с
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/
, увидит только свою учетную запись/профиль.