Функция для представления на основе классов (DetailView) Django

Итак, мое функциональное представление в настоящее время выглядит так, и я хотел бы изменить его на представление на основе классов.

Мой просмотр функций

def user_detail(request, username):
    try:
       user = User.objects.get(username=username)
    except User.DoesNotExist:
       raise Http404

Представление на основе моего класса

class UserProfileDetail(DetailView):
    model = User
    template_name = "profiles/user_detail.html"
    #use username instead of pk
    slug_field = "username"

Мой адрес

url(r"^user/(?P<slug>[\w-]+)/$", UserProfileDetail.as_view(), name="user_detail"),

Проблема в том, что когда я перехожу по ссылке http://exampe.com/user/username, я получить профиль анонимного пользователя. Я не хочу этого. Какие изменения я должен внести в свой класс UserProfileDetail?

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


person user2241826    schedule 03.04.2013    source источник


Ответы (2)


Вам нужно переопределить context_object_name, потому что по умолчанию django.contrib.auth.context_processors.auth устанавливает переменную контекста шаблона {{ user }} либо в request.user, либо в AnonymousUser. Итак, вам нужно переопределить контекст

переопределить context_object_name из класса DetailView

# Detail Views
class UserDetailView(DetailView):
    model = User
    template_name = "profiles/user_detail.html"
    #use username instead of pk
    slug_field = "username"
    #override the context user object to user_profile
    context_object_name = "user_profile"

и в использовании шаблона

{{ user_profile }}
person Iqbal    schedule 04.04.2013

Вы добавили slug_field = "username" в свой класс, что неверно в данном случае. slug_field в вашем случае должно быть просто "slug", так как это названная группа вы указали часть имени пользователя в своем URL: .../(?P<slug>[\w-]+)/.... Django автоматически предполагает, что ваш slug_field называется slug, поэтому вы можете просто удалить строку slug_field = "username" или изменить свой URL-адрес на:

url(r"^user/(?P<username>[\w-]+)/$", UserProfileDetail.as_view(), name="user_detail"),
person Timmy O'Mahony    schedule 03.04.2013
comment
Да, я думаю, вы ошиблись. Я знаю, что мне нужно сделать что-то вроде get_queryset и get_object в моем классе UserProfileDetal, чтобы иметь аналогичный базовый вид функции для пользователя = User.objects.get(username=username) - person user2241826; 03.04.2013