Я хочу, чтобы мой 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})
Вернуться на верх