我有一个Django模板,我们称之为index.html,它分为3个部分(标题,内容和页脚)。在标题部分,我有一个搜索栏,其中包含一个下拉菜单,允许用户从中选择一个选项并根据所选选项搜索内容。我希望标题部分包含在我以后的所有视图/模板中,并且仍然显示包含所有选项的下拉菜单。
这是我目前在视图文件中的内容
def index(request):
return render(
request,
'home.html',
{'categories': get_all_categories()}
)
def cart(request):
return render(request, 'cart.html', {'categories': get_all_categories()})
def help(request):
return render(request, 'help.html', {'categories': get_all_categories()})
def about(request):
return render(request, 'about.html', {'categories': get_all_categories()})
def contact(request):
return render(request, 'contact.html', {'categories': get_all_categories()})
def search(request):
return render(request, 'search.html', {'categories': get_all_categories()})
def get_all_categories():
return Category.objects.all()
这就是我的cart.html {%extends“index.html”%}
{% block content %}
<div>
<h1> My Cart </h1>
</div>
{% endblock %}
这是contact.html的内容 {%extends“index.html”%}
{% block content %}
<div>
<h1> Contact </h1>
</div>
{% endblock %}
这是home.html包含的内容 {%extends“index.html”%}
{% block content %}
<div>
<h1> Home </h1>
</div>
{% endblock %}
现在可行,但我想知道是否有更好的解决方法,以便我不必在所有视图中重复相同的代码。
答案 0 :(得分:2)
您可以编写自定义context processor以在您呈现的每个模板中包含该变量。
例如,编写如下所示的上下文处理器(在context_processors.py
中说):
def category_context_processor(request):
return {
'categories': get_all_categories(),
}
并将其包含在settings.py
:
TEMPLATES = [
...
'OPTIONS': {
'context_processors': [
...
'myapp.context_processors.category_context_processor',
],
},
}
现在变量categories
在您呈现的每个模板中都可用(无论如何使用render
调用或RequestContext
),无论您实际从视图传递的上下文如何。< / p>
答案 1 :(得分:0)
您也可以使用模板标记。
polls/
__init__.py
models.py
templatetags/
__init__.py
poll_extras.py
views.py
在你的poll_extras.py文件中
from django import template
register = template.Library()
@register.simple_tag
def get_categories(request, arg1, arg2, ...):
return {
'categories': get_all_categories(),
}
或者您可以将inclusion_tag与其自己的模板一起使用(在所有视图中保持不变):
@register.inclusion_tag('categories_block_template.html')
def get_categories(arg1, arg2, *args, **kwargs):
categories = Category.objects.filter(field1=arg1, ...)
...
最后,在模板中,您需要加载模板标签并使用它:
{% load poll_extras %}
您可以详细了解templatetags here