Переменные Django от шаблонов до представлений - лучшая практика - PullRequest
3 голосов
/ 10 января 2012

Я понимаю, что использование:

...
return render_to_response('mytemplate.html',
locals(), context_instance=RequestContext(request))

в представлениях не считается хорошим кодом, а что-то вроде:

...
return render_to_response('mytemplate.html', {
        'some_variable' : some_variable,
        'some_list': some_list,
}, context_instance=RequestContext(request)) 

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

...
some_variable = None
some_variable = <some business logic>
return render_to_response('mytemplate.html', {
        'some_variable' : some_variable,
        'some_list': some_list,
}, context_instance=RequestContext(request)) 

, что приведет к более длинному коду представления.Или я должен проверить наличие переменных, прежде чем включать их в ответ?

Конечно, если я ничего не делаю, я получаю:

local variable 'some_variable' referenced before assignment

Любые предложения приветствуются.

Ответы [ 2 ]

2 голосов
/ 10 января 2012

Либо создайте свой контекст условно, то есть:

context = { 'some_list': some_list }

...

if <something>:
    context['some_variable'] = some_variable

...

return render_to_response('mytemplate.html', context, context_instance=RequestContext(request)    

, либо используйте разумные значения по умолчанию:

return render_to_response('mytemplate.html', {
    'some_variable' : some_variable or 'Default',
    'some_list': some_list,
}, context_instance=RequestContext(request))
2 голосов
/ 10 января 2012

Средним способом является использование самого словаря контекста в качестве стека.

context = {}
if <condition>:
    context['cond1'] = 'foo'

if <condition2>:
    context['cond2'] = 'bar'

return render_to_response('template.html', context)

(Также обратите внимание, что начиная с Django 1.3 вы можете использовать render(request, template, context) вместо longwinded context_instance=RequestContext stuff.)

...