【问题标题】:How can I send context to Django in every page without sending from all the views如何在每个页面中向 Django 发送上下文而不从所有视图发送
【发布时间】:2020-12-30 01:45:37
【问题描述】:

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

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 %}这一行。

知道如何解决这个问题吗? 谢谢!

【问题讨论】:

  • 如果您在视图中编写的行数很少,那么您可以通过多个 url 调用特定视图并通过获取 url 执行不同的任务,然后使用 if else。

标签: python django django-views django-templates tags


【解决方案1】:

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

【讨论】:

  • 好吧,它似乎不起作用,我不确定应该将{% a_tag_name request %} 标记名称放在哪里,它在我的基本模板中吗?或从基本模板扩展而来的子模板。
  • 你可以把它放在任何模板中。假设 a_tag_name 作为在 condition.html 上呈现的方法。当您在任何其他模板中使用 {% a_tag_name request %} 时。您正在使用请求参数调用 a_tag_name。它返回条件.html中定义的django模板代码(html)。所以它可以放在基础模板中。如有错误请分享。
  • 我已经用我试图解释的错误编辑了我的问题。
猜你喜欢
  • 2020-03-24
  • 1970-01-01
  • 2017-11-03
  • 1970-01-01
  • 2014-11-08
  • 1970-01-01
  • 2018-03-19
  • 2021-02-07
  • 2020-05-13
相关资源
最近更新 更多