Имя пользователя в URL для профиля пользователя Django
У меня есть проект Django, который использует профили для пользовательской информации. Все работает, за исключением одного аспекта... Вот фрагменты кода для описания моей проблемы.
В шаблоне:
<li><a href="/accounts/{{ user.username }}/profile/">Profile</a></li>
В views.py
class UserProfileView(View):
@method_decorator(login_required)
def get(self, request, user):
profile = get_object_or_404(UserProfile, user=request.user)
return render(request, 'accounts/profile.html', {'profile': profile})
В urls.py
url(r'^accounts/(?P<user>.+)/profile/$',
UserProfileView.as_view(),
name='user_profile_view'
),
Я попробовал варианты для названной группы, и это то, что я нашел, чтобы работать. Проблема в том, что я могу использовать любую строку между /accounts/
а также /profile/
(очевидно) и это работает. Я хочу, чтобы в URL действовал только логин текущего пользователя, а в противном случае 404
,
1 ответ
Вы действительно нуждаетесь в пользовательском параметре в URL профиля? Если вы хотите, чтобы это работало только для текущего пользователя, то почему бы просто не сбросить user
параметр:
# urls.py
url(r'^accounts/profile/$',
UserProfileView.as_view(),
name='user_profile_view'
),
# views
class UserProfileView(View):
@method_decorator(login_required)
def get(self, request):
profile = get_object_or_404(UserProfile, user=request.user)
return render(request, 'accounts/profile.html', {'profile': profile})
В коде, который вы разместили, UserProfileView.get
Метод не использовал user
параметр в любом случае.
ОБНОВИТЬ
Если вы хотите сохранить user
параметр и заставить его работать так, как вы хотите, вы можете изменить вид следующим образом:
from django.http import Http404
class UserProfileView(View):
@method_decorator(login_required)
def get(self, request, user):
if request.user.username == user:
profile = get_object_or_404(UserProfile, user=request.user)
return render(request, 'accounts/profile.html', {'profile': profile})
else:
raise Http404
Кстати, так как user
в списке параметров get
Метод на самом деле просто имя пользователя, в отличие от объекта пользователя, было бы лучше переименовать его в username
, чтобы избежать путаницы.