имя пользователя django в URL, а не в id - PullRequest
3 голосов
/ 10 июня 2010

в мини виртуальном сообществе, у меня есть функция profile_view, так что я могу просматривать профиль любого зарегистрированного пользователя. Функция просмотра профиля имеет в качестве параметра идентификатор пользователя, которому принадлежит профиль, поэтому, когда я хочу получить доступ к профилю пользователя 2, например, я называю его так: http://127.0.0.1:8000/accounts/profile_view/2/

Моя проблема в том, что я хотел бы иметь имя пользователя в URL, а не идентификатор. Я пытаюсь изменить свой код следующим образом, но он все еще не работает. Вот мой код:

вид:

def profile_view(request, user):
        u = User.objects.get(pk=user)
        up = UserProfile.objects.get(created_by = u)
        cv = UserProfile.objects.filter(created_by = User.objects.get(pk=user))
        blog = New.objects.filter(created_by = u) 
        replies = Reply.objects.filter(reply_to = blog)
        vote = Vote.objects.filter(voted=blog)
        following = Relations.objects.filter(initiated_by = u)
        follower = Relations.objects.filter(follow = u)
    return render_to_response('profile/publicProfile.html', {
        'vote': vote,
        'u':u,  
        'up':up, 
        'cv': cv, 
        'ing': following.order_by('-date_initiated'),  
        'er': follower.order_by('-date_follow'),
        'list':blog.order_by('-date'),
        'replies':replies
        }, 
        context_instance=RequestContext(request)) 

и мой URL:

urlpatterns = patterns('',
                        url(r'^profile_view/(?P<user>\d+)/$', 
                           profile_view,
                           name='profile_view'),

спасибо заранее!

Ответы [ 5 ]

22 голосов
/ 10 июня 2010

Вы не показываете, что вы пробовали, или где у вас возникли проблемы. В конце концов, это довольно просто - просто передайте строку имени пользователя в функцию вместо целого числа и посмотрите на основании этого.

def profile_view(request, username):
    u = User.objects.get(username=username)

и измените ваш URL, чтобы разрешить строки, а не целые числа:

url(r'^profile_view/(?P<username>\w+)/$', 
                       profile_view,
                       name='profile_view'),
9 голосов
/ 28 апреля 2013

Вот как я это делаю, используя общие представления на основе классов и использование слагов. Это на удивление легко и требует всего несколько строк кода с помощью слагов.

# accounts/views.py
from django.contrib.auth.models import User
from django.views.generic.detail import DetailView

class UserProfileView(DetailView):
    model = User
    slug_field = "username"
    template_name = "userprofile.html"

# accounts/urls.py
from views import UserProfileView
urlpatterns = patterns('',
    # By user ID
    url(r'^profile/id/(?P<pk>\d+)/$', UserProfileView.as_view()),
    # By username
    url(r'^profile/username/(?P<slug>[\w.@+-]+)/$', UserProfileView.as_view()),
)

Теперь вы можете получить доступ как к пользователю, например accounts/profile/id/123/, так и к accounts/profile/username/gertvdijk/.

Что здесь происходит?

  • Обычно обязательный pk параметр URL-адреса опускается и заменяется slug в шаблоне URL-адреса. Это принимается мнением, потому что ...
  • Параметр slug используется DetailView (или любым другим представлением на основе SingleObjectMixin), чтобы найти объект в User.username с использованием model = User и slug_field = "username". ( 1019 * документы *)
  • Поскольку поле slug является необязательным, представление также успешно обрабатывается с использованием только параметра pk.
2 голосов
/ 10 июня 2010

Добавьте в начало файла:

from django.shortcuts import get_object_or_404

и замените

u = User.objects.get(pk=user)

на

u = get_object_or_404(User, <login>=user)

, где login isполе имени пользователя в модели User.

0 голосов
/ 06 марта 2019

В urls.py

urlpatterns = [
    path('<str:username>/', UserDetailView.as_view(), name='user_detail'),
]

С представлением на основе класса.

class UserDetailView(LoginRequiredMixin, DetailView):

    model = User
    slug_field = "username"
    slug_url_kwarg = "username"
    template_name = "account/user_detail.html"

    def get_object(self):

        object = get_object_or_404(User, username=self.kwargs.get("username"))

        # only owner can view his page
        if self.request.user.username == object.username:
            return object
        else:
            # redirect to 404 page
            print("you are not the owner!!")

Я тестировал в Django 2.1.

0 голосов
/ 09 сентября 2018

Для Django 2.0 и выше:

path(‘profile/<username>/, views.profile, name=‘profile’),
...