Я хочу, чтобы мой url заканчивался на details/logged-in-user/
Я создаю страницу профиля для проекта. Когда пользователь пытается заполнить свои данные, я хочу, чтобы url trailig был localhost:8002/detail/logged-in-user.username.
Пример
localhost:8002/detail/dubsy
Моя проблема в том, что каждый раз, когда я редактирую имя пользователя в url и предоставляю другое имя пользователя, которое не вошло в систему, оно все равно выводит страницу, а я этого не хочу.
views.py
@login_required(login_url="signin")
def details(request, username):
user = User.objects.get(username=username)
form = Details()
if request.method == "POST":
form = Details(request.POST, request.FILES)
if form.is_valid():
detail = form.save(commit=False)
detail.username = request.user
detail.save()
return redirect(success, pk=detail.pk)
else:
form = Details(initial={"matricno":request.user.username})
return render(request, "details.html", {"form":form})
urls.py
from django.urls import path
from . import views
urlpatterns = [
path("details/<str:username>/", views.details, name="details"),
]
Моя проблема заключается в том, что я хочу предотвратить отображение страницы для пользователя, который не вошел в систему.
Если вы хотите, чтобы вошедший в систему пользователь использовал правильное имя пользователя для доступа к страницам с подробной информацией, вы можете добавить логику, проверяющую, что str:username(из url) и username(из сессии) одинаковы.
@login_required(login_url="signin")
def details(request, username):
user = User.objects.get(username=username)
if user != request.user:
# do something
return render(request, "details.html", {'alert':'check your username'})
form = Details()
if request.method == "POST":
form = Details(request.POST, request.FILES)
if form.is_valid():
detail = form.save(commit=False)
detail.username = request.user
detail.save()
return redirect(success, pk=detail.pk)
else:
form = Details(initial={"matricno":request.user.username})
return render(request, "details.html", {"form":form})
Дополнительно, если вы хотите предотвратить ошибку 'User matching query does not exist.', возникающую при вводе незарегистрированного имени пользователя, вы можете изменить get() на filter() следующим образом.
@login_required(login_url="signin")
def details(request, username):
user = User.objects.filter(username=username)
if user != request.user:
# do something
return render(request, "details.html", {'alert':'check your username'})
form = Details()
if request.method == "POST":
form = Details(request.POST, request.FILES)
if form.is_valid():
detail = form.save(commit=False)
detail.username = request.user
detail.save()
return redirect(success, pk=detail.pk)
else:
form = Details(initial={"matricno":request.user.username})
return render(request, "details.html", {"form":form})