簡體   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