2010-06-10 3 views
3

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

Моя проблема заключается в том, что я хотел бы иметь имя пользователя в 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'), 

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

ответ

19

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

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

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

url(r'^profile_view/(?P<username>\w+)/$', 
         profile_view, 
         name='profile_view'), 
+10

на основе того, что я вижу в django/contrib/auth/forms.py. Я думаю, что лучшее регулярное выражение, используемое для захвата имени пользователя, равно (? P [\ w. @ + -] +) –

+0

Что делать, если имя пользователя это электронная почта, и вы не хотите, чтобы эта информация была общедоступной? Вы могли бы использовать имя пользователя и фамилию, но это можно было бы продублировать, поэтому я думаю, что мы должны добавить идентификатор или хэш в идентификаторе. – jobima

2

Добавить в верхней части файла:

from django.shortcuts import get_object_or_404 

и заменить

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

с

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

где Логин это поле имени пользователя в модели пользователя.

+0

Я заменил так же, как вы сказали, и говорит, что у меня есть синтаксическая ошибка в строке «u = User.objects.get ( = пользователь) « – dana

+1

Замените логин именем поля, которое является именем пользователя. Я не знаю, как это называется. Также посмотрите на другой ответ и исправьте URL. –

+0

да, вот и все! :) спасибо – dana

9

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

# 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>[\[email protected]+-]+)/$', 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". (docs)
  • Поскольку поле пули является дополнительным, представление также с удовольствием служит только с параметром pk.
+1

Что произойдет, если у пользователя было какое-то из. @ +, так как это недопустимые символы в пуле? – rozzy

+0

Как вы это сделаете в случае расширения User to UserProfile (вы знаете, t больше полей для пользователя). Модель пользователя имеет поле «имя пользователя», но модель UserProfile имеет настраиваемые поля, которые я тоже хочу показать. – RicardoGonzales

+0

@ RicardoGonzales Это довольно просто ... измените 'model' и' slug_field'. Работает с каждой моделью Django, этот рецепт, а не только с 'User's. – gertvdijk