Django设计问题 - 搜索栏

时间:2011-03-23 14:00:48

标签: python django

我正在开发一个网站,一旦您登录,搜索栏将始终显示在页面顶部。我想知道在Django中设计这个范例的最佳方式是什么。目前,我有一个名为forms.py的独立文件,位于我的文件夹层次结构中的settings.py级别。几乎在每个视图中,我都要添加

from forms.py import SearchForm

然后在每个渲染调用中我必须传递

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

我已经四处寻找更好的方法,但我找不到任何有用的东西。我觉得我使用的当前设计并不理想,因为我几乎在每个视图中都需要导入/传递参数。

表单是在base.html中定义的,所以我使用的是模板继承,但是我仍然需要将表单对象传递给每个渲染器。

谢谢高级。

2 个答案:

答案 0 :(得分:3)

Use a context processor

使用RequestContext将您的搜索表单添加到所有观看的上下文中,您正在使用的新render会自动执行此操作。

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

你说它几乎用在所有视图中,这不是一个实例化表单的昂贵操作,所以我会使用这个解决方案。

答案 1 :(得分:0)

用django< 1.3你可以有一个装饰器,它可以处理渲染html:

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,您可以使用基于类的视图,使用类似的方法。