Аутентификация пользователя в Django - PullRequest
0 голосов
/ 04 декабря 2009

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

В файле urls.py моего проекта у меня есть ^ accounts / login / $ и ^ accounts / logout / $, оба подключены к встроенным представлениям login () и logout () (в django.contrib.auth .views) и ^ account / profile / $ связан с написанным мною представлением, называемым «start_here», содержимое которого в основном таково:

def start_here(request):
    if request.user:
        user_obj = request.user
    else:
        user_obj = None
    is_auth = False
    if request.user.is_authenticated():
        is_auth = True
    return render_to_response("profile.html", {'auth': is_auth,'user': user_obj,})

Теперь «profile.html» расширяет мастер-шаблон, называемый master.html, внутри которого находится блок «navbar», содержимое которого должно измениться, если «auth» == True (фрагмент ниже)

{% block navbar %}
            {% if auth %}
                <a href="">Link A</a>
                <a href="">Link B</a>
                <a href="">Link C</a>
                <a href="">Link D</a>
                <a href="">Link E</a>
                <a href="">Link F</a>
                <a href="/accounts/logout/">Logout</a>
            {% else %}
                <a href="/accounts/login/">Login</a>
            {% endif %}
{% endblock %}

Моя проблема в том, что когда я вхожу, и он перенаправляет на / account / profile, панель навигации не отображает ссылки A-F + Logout, она отображает только «логин». Это не сработает так, как я ожидаю, если я вручную не скопирую и не вставлю вышеупомянутый блок в profile.html. При вызове render_to_response () передается ли предоставленный мною контекст как родительскому шаблону, так и дочернему?

Полный исходный код для master и profile.html: http://dpaste.com/hold/128784/ Я не вижу ничего подозрительного в коде.

Ответы [ 3 ]

6 голосов
/ 04 декабря 2009

Этот ответ является косвенным, но предложение Джима использовать RequestContext настолько хорошо, что я хочу подробно объяснить, как это сделать.

Вы можете уменьшить start_here функцию до

from django.template import RequestContext

def start_here(request):
    return render_to_response("profile.html", {},
        context_instance=RequestContext(request))

Используя RequestContext, user автоматически добавляется в контекст. Вместо использования

{% if auth %}

использование

{% if user.is_authenticated %}
1 голос
/ 04 декабря 2009

Чтобы убедиться, что django правильно идентифицирует пользователей, вам необходимо убедиться, что он правильно включен в вашем модуле настроек. в частности, вы должны убедиться, что в вашем settings.MIDDLEWARE_CLASSES включены модули SessionMiddleware и AuthenticationMiddleware. Также убедитесь, что auth в ваших установленных приложениях и вы запустили syncdb с момента его включения.

Если вы не предприняли вышеуказанные шаги, django не сможет определить, когда пользователи вошли в систему, и правильно выполнить настройку запроса.

1 голос
/ 04 декабря 2009

Да, контекст, который вы передаете в render_to_response (), передается в именованные шаблоны и ВСЕ шаблоны, которые он включает или наследует.

Вы должны изучить Использование RequestContext

Еще одна вещь, чтобы проверить ...

Просто убедившись:

шаблон вашего профиля начинается с

{% extends 'master.html' %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...