首页 > 解决方案 > 如何在每个页面中向 Django 发送上下文而不从所有视图发送

问题描述

我正在尝试创建一个电子商务应用程序并在其中包含购物车选项。但是,在网站的每个页面(或每个视图)上,我总是输入代码......

context = {
        "no_in_cart":no_of_items_in_cart(request)
}

哪里no_of_items_in_cart是查找购物车中商品数量的功能。但我觉得这是对代码的浪费,可能有几个低效率的地方。而且我不确定如何发送此代码auth_views,例如登录或注册视图。

任何帮助将不胜感激。谢谢!

编辑内容

所以现在在我的 tag_name.py 我有代码..

from django import template
register = template.Library()


@register.inclusion_tag("base.html")
def a_tag_name(request):
    return {"no_in_cart":no_of_items_in_cart(request)}



def no_of_items_in_cart(request):
    total = 0
    for item in request.session.get('order'):
        total += item["quantity"]

    return (total)

在我的 base.html 中,页面顶部有以下标签...

{% load static %}
{% load tag_name %} 
{% a_tag_name request %}
<!DOCTYPE html>
<html lang="en">
<head>
...

而且我不会重复标签{% load tag_name %} {% a_tag_name request %}任何其他子模板。

然而,这样做,我被抛出一个错误......

Exception Type: AttributeError
Exception Value:'str' object has no attribute 'session'

它突出了这条线{% a_tag_name request %}

关于如何解决这个问题的任何想法?谢谢!

标签: pythondjangodjango-viewsdjango-templatestags

解决方案


如果我正确理解您的问题。您在许多页面中显示“no_in_cart”,每次呈现页面时都必须传递此上下文变量。您希望有一种方法可以在许多页面中使用上下文变量(no_in_cart),但您不必每次都传递它。这可以使用模板标签来完成。不确定它是否有效。如果你愿意,我可以提供一个示例代码来处理模板标签。

如下所述创建文件:-

Appdirectory
   templatetags
     __init__.py
     tag_name.py
   models.py
   views.py

在 tag_name.py 中:-

from django import template
register = template.Library()


@register.inclusion_tag("condition.html")
def a_tag_name(request):
   return {"no_in_cart":no_of_items_in_cart(request)}

然后在 condition.html:-

# some django template code(html) if required
{{no_in_cart}}

然后最后在您要使用它的页面中。在顶部首先加载标签

{% load tag_name %} 

然后把这个放在想要的地方 {% a_tag_name request %}

文件的位置应与指定的一样。您可以重命名除模板标签之外的所有内容。同时运行 manage.py collectstatic。希望能帮助到你。

如果您想了解有关标签的更多信息,请参阅:- https://docs.djangoproject.com/en/3.1/howto/custom-template-tags/

https://medium.com/@hiteshgarg14/creating-custom-template-tags-in-django-application-7bd1dcfeb144


推荐阅读