繁体   English   中英

如何在每个页面中向 Django 发送上下文而不从所有视图发送

[英]How can I send context to Django in every page without sending from all the views

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

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

其中no_of_items_in_cart是 function 以查找购物车中的商品数量。 但我觉得这是对代码的浪费,可能有几个低效率的地方。 而且我不确定如何通过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 %}行。

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

如果我正确理解您的问题。 您在许多页面中显示“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)}

然后在条件下。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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM