проблемы рендеринга шаблона при использовании декоратора в Django - PullRequest
0 голосов
/ 29 сентября 2010

У меня есть этот URL в моем проекте:

url(r'^alerts/inbox/$', 'inbox', {'template_name': 'inbox.xhtml' }, name = 'inbox'),

Представление «Входящие» в точности такое:

@login_required()
@ownsBid
def inbox(request, template_name):
    return render_to_response(template_name, context_instance=RequestContext(request))

Мой декоратор ownsBid:

def ownsBid(fn):
    def _check(request, *args, **kwargs):
        return fn(request, kwargs)

    return _check

Когда я использую:

fn(request, kwargs) 

, я получаю TemplateDoesNotExist в / alerts / inbox / .Если я сделаю вместо этого:

fn(request, kwargs['template_name'])

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

1 Ответ

2 голосов
/ 29 сентября 2010

Можете ли вы попробовать fn(request, **kwargs) вместо этого? Вот быстрая иллюстрация:

>>> def foo(template_name):
 print template_name

>>> d = dict(template_name =  'foo/bar.html')
>>> foo(d)
{'template_name': 'foo/bar.html'}
>>> foo(**d)
foo/bar.html
>>> 

Так что здесь происходит? В первом случае (foo(d)) вы передаете словарь функции как есть. Естественно, значение template_name является тогда объектом словаря.

Во втором случае (foo(**d)) вы расширяете , распаковываете словарь и передаете ключи и значения в качестве аргументов ключевого слова. Ключ template_name станет аргументом ключевого слова, а его значение будет foo/bar.html.

...