Включая статистику пользователя для нескольких просмотров - PullRequest
4 голосов
/ 29 декабря 2011

У меня есть панель навигации, которая отображает «логин» и «регистрация», когда пользователь не вошел в систему. Когда пользователь вошел в систему, на панели навигации отобразится имя пользователя и количество сообщений, которые он имеет в своем почтовом ящике..

Проблема в том, что страница навигации присутствует примерно на 50 страницах, поэтому существует около 50 функций просмотра, которые должны получать информацию о пользователе и отправлять ее в шаблон.Если я захочу изменить это позже, это будет боль!

Например, вот примерное представление:

def index(request):
  user = request.user
  ...
  return render_to_response("page.html", {'user': user})

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

{% if user %}
...
{% else %}
....
{% endif %}

Есть ли более чистый способ сделать это?

Редактировать: Кроме того, у меня естьмодель UserProfile, которую я хочу отправить в шаблон.Есть ли способ сделать это тоже?

Ответы [ 4 ]

2 голосов
/ 29 декабря 2011

Самый простой способ - включить django.contrib.auth.context_processors.auth в конфигурацию TEMPLATE_CONTEXT_PROCESSORS в вашем settings.py.Как описано в документации , в контекст шаблона будет добавлена ​​переменная user и perms, которая дает вам прямой доступ к текущему пользователю.

Не то, чтобы конфигурация по умолчанию для TEMPLATE_CONTEXT_PROCESSORS это (в Django 1.3):

("django.contrib.auth.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
"django.core.context_processors.static",
"django.contrib.messages.context_processors.messages")

Таким образом, процессор контекста уже должен быть активным, и у вас должна быть возможность доступа к переменной user в ваших шаблонах, не возвращая ее в виде.

В ваших представлениях вы можете просто использовать ярлык render, который позаботится о создании необходимого экземпляра RequestContext:

from django.shortcuts import render

def my_view(request):
    return render(request, 'template.html' )
2 голосов
/ 29 декабря 2011

Вы можете создать собственный тег шаблона, как предложил DrTyrsa, или вы можете создать контекстный процессор .

0 голосов
/ 29 декабря 2011

Почему вам нужно отправлять пользователя для каждого просмотра, HttpRequest содержит пользователя, вы можете легко получить доступ к нему в шаблоне, когда вы вошли в систему.

и еще одно решение - сохранить пользователя в сеансах и получить к нему доступ в любом представлении или шаблоне.

0 голосов
/ 29 декабря 2011

Для этого вам понадобится пользовательский тег шаблона .

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