Можно ли проверить, установлена ​​ли уже переменная контекста в представлении в определении пользовательского процессора контекста? - PullRequest
3 голосов
/ 13 мая 2011

Проблема в том, что в некоторых представлениях я вручную получаю интересующую переменную контекста (скажем, «G»), поскольку использую ее для поиска другой информации в этом конкретном представлении (т. Е. Представления A, B, C), но вВ других представлениях (т. е. X, Y, Z) мне нужно получить эту конкретную переменную контекста, поскольку этот контекст должен быть доступен в каждом отдельном представлении моего проекта (поскольку мой базовый шаблон использует переменную контекста).Проблема с использованием специального обработчика контекста заключается в том, что, как я полагаю, он будет выполнять дополнительный и ИДЕНТИЧНЫЙ вызов БД в представлениях (A, B, C), поскольку эти представления уже получают эту переменную контекста, так как это необходимо для получения других данных в представлении.Я подумал, что, возможно, мне удастся реализовать процессор контекста, который проверяет, установлена ​​ли конкретная переменная контекста для данного запроса.Это возможно?Есть ли более простое решение?Приведенный ниже код может прояснить проблему для некоторых людей.

Спасибо за любой совет!

def viewA(request):
    g=G.objects.get(user=request.user)
    posts = Post.objects.filter(g=g)
    return direct_to_template(request,'something.html',{'G':g, 'posts':posts})

def viewX(request):
    stuff = Albums.objects.get(user=request.user)
    return direct_to_template(request,'something2.html',{'stuff':stuff})

def my_context_processor(request): #redundant in case of viewA (hits db again?)
    return {'G':G.objects.get(user=request.user)} 

def ideal_processor(request):
    #check context vars to see if G is already in there
    #if it is, return {}, else, return {'G':G.objects.get(user=request.user)} 

Ответы [ 2 ]

0 голосов
/ 04 июля 2011

Я только что создал промежуточное программное обеспечение, которое устанавливает переменную G для запроса. G, так как она мне нужна практически для каждого запроса. i.e.:

class GuildMiddleware(object):
    def process_request(self, request):
        request.G = figure_out_what_G_is()
        return None

Теперь вы можете использовать request.G в любом месте ваших представлений (и шаблонов, если вы используете direct_to_template, RequestContext и т. Д.).

0 голосов
/ 13 мая 2011
def always_G(request):
    if not hasattr(request, 'G'):
        {'G':G.objects.get(user=request.user)}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...