Django Design Question - Панель поиска - PullRequest
1 голос
/ 23 марта 2011

Я занимаюсь разработкой сайта прямо сейчас, чтобы после входа в систему в верхней части страницы всегда находилась панель поиска. Мне интересно, как лучше всего разработать эту парадигму в Django. В настоящее время у меня есть отдельный файл с именем forms.py, который находится на уровне settings.py в моей иерархии папок. Почти в каждом ракурсе я должен добавить

from forms.py import SearchForm

и затем при каждом вызове рендеринга я должен передать

form = SearchForm()
return render('somepage.html',{"search_form" : form},c=RequestContext())

Я искал лучший способ сделать это, но мне трудно найти что-нибудь полезное. У меня такое ощущение, что текущий дизайн, который я использую, не идеален, так как я обязан импортировать / передавать в качестве параметра почти в каждом представлении.

Форма определена в файле base.html, поэтому я использую наследование шаблонов, но мне все еще нужно передавать объект формы, насколько я могу судить, в каждый рендер.

Спасибо заранее.

Ответы [ 2 ]

3 голосов
/ 23 марта 2011

Использовать контекстный процессор

Добавьте поисковую форму в контекст всех представлений, используя RequestContext, что автоматически делает новая render, которую вы используете.

def FormContextProcessor(request):
    if request.user.is_authenticated():
        return {'form': SearchForm() }
    return {}

Вы сказали, что он используется почти во всех представлениях, и вряд ли это дорогая операция создания экземпляра формы, поэтому я бы использовал это решение.

0 голосов
/ 23 марта 2011

с django <1.3 вы можете иметь декоратор, который может позаботиться о рендеринге html: </p>

def search_render(function):
   # return a decorated function which will take template from the args
   # take output of the inner function (this should be a dictionary e.g. data = ..
   # instantiate SearchForm
   # add SearchForm instance to the data dictionary
   # and return render(template, data, RequestContext(request))

@search_render(tamplate='somepage.html')
def my_other_view(request):
   return {'data':'value'}

С django> = 1.3 вы можете использовать представления на основе классов, с похожим подходом.

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