Варианты Django для обеспечения широкой доступности переменных - PullRequest
5 голосов
/ 13 сентября 2009

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

Как только я достигну своего взгляда, я хочу быть в состоянии сделать

tasks = Task.objects.filter(project = current_project)

WHERE текущий_проект (или CURRENT_PROJECT или current_project ???) уже настроен.

Может кто-нибудь объяснить плюсы / минусы различных подходов, которые я нашел в документах, и поставить меня на правильный путь?

  1. Сессии
  2. Middleware
  3. 1017 * Threading *
  4. 1019 * встроенные команды *

Вот как я это сделал в итоге:

декоратор:

def check4project(fn):

    current_project = 'fred'
    def check(*args, **kw):
        kw['project']=current_project
        return fn(*args, **kw)
    return check

Посмотреть пример

@login_required
@check4project
@tweetpost
def index(request, project=0):

    print project

Ответы [ 3 ]

4 голосов
/ 13 сентября 2009

Все зависит от вашей семантики "текущего проекта". Вот некоторые возможности:

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

  2. Это может быть характеристика URL, основанная исключительно на поддомене. Это можно сделать с помощью промежуточного программного обеспечения, которое имеет доступ к запросу и может, например, проанализировать имя хоста и установить пользовательский атрибут для запроса, к которому вы могли бы обращаться в своих функциях просмотра.

  3. Подобно # 2, вы можете использовать декоратор представления, если проверка проектов выполняется для некоторых представлений, но не для всех. Это похоже на декораторы Django для проверки авторизации.

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

Исходя из вашего описания, он звучит как # 2 или # 3, лучше для вас, в зависимости от того, как ваши взгляды делятся между заботой о подпроектах и ​​нет.

1 голос
/ 13 сентября 2009

Вы можете создать context_processor, а затем получить значение из объекта запроса.

0 голосов
/ 13 сентября 2009

Рассматривали ли вы пользовательский тег шаблона ?

...