Django如何重用所有视图共有的视图功能

时间:2017-02-11 08:05:26

标签: django django-templates django-views

我有一个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 %}

现在可行,但我想知道是否有更好的解决方法,以便我不必在所有视图中重复相同的代码。

2 个答案:

答案 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