Имя пользователя в 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, чтобы избежать путаницы.

Другие вопросы по тегам