Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django设计问题-搜索栏_Python_Django - Fatal编程技术网

Python Django设计问题-搜索栏

Python Django设计问题-搜索栏,python,django,Python,Django,我正在开发一个网站现在,一旦你登录,搜索栏将始终出现在页面的顶部。我想知道在Django设计这个范例的最佳方式是什么。目前,我有一个名为forms.py的单独文件,它位于文件夹层次结构的settings.py级别。在几乎所有的观点中,我必须补充一点 from forms.py import SearchForm 然后在每次渲染调用中,我都必须通过 form = SearchForm() return render('somepage.html',{"search_form" : form},c

我正在开发一个网站现在,一旦你登录,搜索栏将始终出现在页面的顶部。我想知道在Django设计这个范例的最佳方式是什么。目前,我有一个名为forms.py的单独文件,它位于文件夹层次结构的settings.py级别。在几乎所有的观点中,我必须补充一点

from forms.py import SearchForm
然后在每次渲染调用中,我都必须通过

form = SearchForm()
return render('somepage.html',{"search_form" : form},c=RequestContext())
我四处寻找了一个更好的方法,但是我很难找到任何有用的东西。我有一种感觉,我使用的当前设计并不理想,因为我需要在几乎所有视图中作为参数导入/传递

表单是在base.html中定义的,因此我使用模板继承,但我仍然需要尽可能地将表单对象传递给每个渲染


感谢高级版。

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

使用
RequestContext
将搜索表单添加到所有视图的上下文中,您正在使用的新
呈现将自动执行该操作

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

您说过它几乎在所有视图中都会使用,而且实例化表单的操作成本不高,所以我会使用此解决方案。

但此解决方案并没有解决代码的第二部分-渲染渲染不是问题:“表单是在base.html中定义的,所以我使用的是模板继承”不是模板本身,而是调用模板,“return render…”部分调用
render
,指定一个模板,并返回结果是每个django模板涉及的响应的一部分,而不是问题的一部分:)不过,您不明白,您的解决方案只解决了问题的一部分。虽然很简单。eot。