我正在开发一个网站,一旦您登录,搜索栏将始终显示在页面顶部。我想知道在Django中设计这个范例的最佳方式是什么。目前,我有一个名为forms.py的独立文件,位于我的文件夹层次结构中的settings.py级别。几乎在每个视图中,我都要添加
from forms.py import SearchForm
然后在每个渲染调用中我必须传递
form = SearchForm()
return render('somepage.html',{"search_form" : form},c=RequestContext())
我已经四处寻找更好的方法,但我找不到任何有用的东西。我觉得我使用的当前设计并不理想,因为我几乎在每个视图中都需要导入/传递参数。
表单是在base.html中定义的,所以我使用的是模板继承,但是我仍然需要将表单对象传递给每个渲染器。
谢谢高级。
答案 0 :(得分:3)
使用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,您可以使用基于类的视图,使用类似的方法。