【问题标题】:how to make a url variable available to all the template如何使所有模板都可以使用 url 变量
【发布时间】:2021-11-11 05:42:39
【问题描述】:

我有一个特定的要求 - 比如说我点击下面的网址 -

http://127.0.0.1:8000/brand_product_list/1

在上面的 url 中,最后 1 是一个品牌 ID,我需要这个品牌 ID 可用于所有模板,例如。如果我打电话

我的brand_product_list 在views.py 中如下所示-

# Product List as per Brand1
def brand_product_list(request,brand_id):
    brandid = brand_id
    brand_b=Brand.objects.get(id=brand_id)    
    cats_b=Product.objects.filter(brand=brand_b).distinct().values('category__title','category_id')
    data_b=Product.objects.filter(brand=brand_b).order_by('-id')
    colors_b=ProductAttribute.objects.filter(brand=brand_b).distinct().values('color__title','color__id','color__color_code')
    sizes_b=ProductAttribute.objects.filter(brand=brand_b).distinct().values('size__title','size__id')
    flavors_b=ProductAttribute.objects.filter(brand=brand_b).distinct().values('flavor__title','flavor__id')
    
    return render(request,'brand_product_list.html',
    {
        'data_b':data_b,
        'brandid':brandid,
        'cats_b':cats_b,
        'brand_b':brand_b,
        'sizes_b':sizes_b,
        'colors_b':colors_b,
        'flavors_b':flavors_b,
    })

在上面的代码中,我需要 brandid 在 cart.html 中可用,这是通过单击在 brand_product_list.html 中扩展的 base.html 中的购物车按钮调用的

要点是因为 base.html 在brand_product_list.html 中扩展,所以brandid 可用于base.html(表示父级中可用的子变量),我可以根据品牌过滤东西,但是当我单击base 中的购物车按钮时不知何故.html,即使 base.html 在 cart.html 中扩展,相同的品牌 ID 也不会被带到 cart.html(意味着父变量在子级中不可用)。

我尝试包含如下

{% include "./brand_product_list.html" %}

但是由于在brand_product_list.html中,有一些filter.html,它会抛出参数不可用的错误--

NoReverseMatch at /cart
Reverse for 'filter_data_b' with arguments '('brandid',)' not found. 1 pattern(s) tried: ['filter_data_b/(?P<brand_id>[0-9]+)$']
Request Method: GET
Request URL:    http://127.0.0.1:8000/cart
Django Version: 3.2.8
Exception Type: NoReverseMatch
Exception Value:    
Reverse for 'filter_data_b' with arguments '('brandid',)' not found. 1 pattern(s) tried: ['filter_data_b/(?P<brand_id>[0-9]+)$']
Exception Location: C:\Users\j1011470\Documents\Personal\Business\env\lib\site-packages\django\urls\resolvers.py, line 694, in _reverse_with_prefix
Python Executable:  C:\Users\j1011470\Documents\Personal\Business\env\Scripts\python.exe
Python Version: 3.8.8
Python Path:    
['C:\\Users\\j1011470\\Documents\\Personal\\Business\\Pitaara',

我请求您在这种情况下提供帮助..

是否有可能将 context_processor 与请求和一个参数一起使用?或其他方式...


在 base.html 中点击购物车按钮时调用的

cart.html 如下 -

{% extends './base.html' %}
{% load static %}
{% block content %}
<script src="{% static 'custom.js' %}"></script>
<main class="container my-4" id="cartList">
    <!-- Featured Products -->
    <h3 class="my-4 border-bottom pb-1">Cart ({{totalitems}})</h3>
    <table class="table table-bordered">
        <thead>
            <tr>
                <th>Product</th>
                <th>Qty</th>
                <th>Price</th>
                <th>Total</th>
            </tr>
        </thead>
        <tbody>
            {% for product_id,item in cart_data.items %}
            <tr>
                <td>
                    <img src="/media/{{item.image}}" width="50" />
                    <p><a href="/product/{{item.title|slugify}}/{{product_id}}">{{item.title}}</a></p>
                </td>
                <td>
                    <input type="number" class="product-qty-{{product_id}}" value="{{item.qty}}" style="vertical-align: bottom;" />
                    <button class="btn btn-sm btn-primary update-item" data-item="{{product_id}}"><i class="bi bi-arrow-clockwise"></i></button>
                    <button class="btn btn-sm btn-danger delete-item" data-item="{{product_id}}"><i class="bi bi-trash"></i></button>
                </td>
                <td>$ {{item.price}}</td>
                <td>$ {% widthratio item.price 1 item.qty %}</td>
            </tr>
            {% endfor %}
        </tbody>
        <tfoot>
            <tr>
                <td colspan="2"></td>
                <th>Total</th>
                <th>Rs. {{total_amt}}</th>
            </tr>
            {% if totalitems %}
            <tr>
                <td colspan="4" align="right">
                    <a href="/" class="btn btn-dark btn-sm">Checkout <i class="fa fa-long-arrow-alt-right"></i></a>
                </td>
            </tr>
            {% endif %}
        </tfoot>
    </table>
</main>
{% endblock %}

base.html 在下面

{% load static %}
<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8" />
    <title>{% block title %}Delicious Doughnuts{% endblock %}</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"
        integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.bundle.min.js"
        integrity="sha384-ygbV9kiqUc6oa4msXn9868pTtWMgiQaeYH7/t7LECLbyPA2x65Kgf80OJFdroafW"
        crossorigin="anonymous"></script>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.6.1/font/bootstrap-icons.css">
</head>

<body>

    <header>
        <nav class="navbar navbar-expand-md navbar-light bg-white border-bottom">
            <div class="container-fluid">
                <a class="navbar-brand" href="#">Delicious</a>
                <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarCollapse"
                    aria-controls="navbarCollapse" aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                </button>
                <div class="collapse navbar-collapse" id="navbarCollapse">
                    <ul class="navbar-nav me-auto mb-2 mb-md-0">
                        {% if brandid %}
                        <li class="nav-item active">
                            <a class="nav-link" aria-current="page" href="/brand_product_list/{{brandid}}">Home</a>
                        </li>
                        <li class="nav-item active">
                            <a class="nav-link" aria-current="page" href="/brand_product_list/{{brandid}}">Link</a>
                        </li>
                        {% elif cart_data.items %}
                        {% for productid, item in cart_data.items %}
                        {% if forloop.first %}
                        <li class="nav-item active">
                            <a class="nav-link" aria-current="page" href="/brand_product_list/{{item.brandid}}">Home</a>
                        </li>
                        {% endif %}
                        {% endfor %}                        
                        {% endif %}                            
                    </ul>                    
                    <form class="d-flex">
                        <a aria-current="page" href="{% url 'cart' %}"><i class="bi bi-cart3" style="font-size: 1.5rem; color: cornflowerblue;"></i>Cart (<span class="cart-list">{{request.session.cartdata|length}}</span>)</a>
                        <ul>
                        <li class="nav-item dropdown">
                            <a class="btn btn-secondary dropdown-toggle" href="#" id="navbarDropdown" type="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                              <i class="bi bi-user"></i> My Account
                            </a>
                            <div class="dropdown-menu" aria-labelledby="navbarDropdown">
                            {% if user.is_authenticated %}
                                <a class="dropdown-item" href="d">Dashboard</a>
                                <a class="dropdown-item" href="{% url 'logout' %}">Logout</a>
                            {% else %}
                                <a class="dropdown-item" href="{% url 'login' %}">Login</a>
                              <a class="dropdown-item" href="Signup">Signup</a>
                            {% endif %}
                            </div>
                          </li>
                        </ul>
                    </form>
                    
                </div>
            </div>
    </header>

    <div id="content">
        {% block content %}
        {% endblock %}
    </div>

    <footer class="pt-4 my-md-5 pt-md-5 border-top container">
        <div class="row">
            <div class="col-12 col-md">
            <a href="#">Delicious Doughnuts</a>
            <small class="d-block mb-3 text-muted">&copy; 2017-2020</small>
            </div>
            <div class="col-6 col-md">
            <h5>Features</h5>
            <ul class="list-unstyled text-small">
                <li><a class="text-muted" href="#">Cool stuff</a></li>
                <li><a class="text-muted" href="#">Random feature</a></li>
                <li><a class="text-muted" href="#">Team feature</a></li>
                <li><a class="text-muted" href="#">Stuff for developers</a></li>
                <li><a class="text-muted" href="#">Another one</a></li>
                <li><a class="text-muted" href="#">Last time</a></li>
            </ul>
            </div>
            <div class="col-6 col-md">
            <h5>Resources</h5>
            <ul class="list-unstyled text-small">
                <li><a class="text-muted" href="#">Resource</a></li>
                <li><a class="text-muted" href="#">Resource name</a></li>
                <li><a class="text-muted" href="#">Another resource</a></li>
                <li><a class="text-muted" href="#">Final resource</a></li>
            </ul>
            </div>
            <div class="col-6 col-md">
            <h5>About</h5>
            <ul class="list-unstyled text-small">
                <li><a class="text-muted" href="#">Team</a></li>
                <li><a class="text-muted" href="#">Locations</a></li>
                <li><a class="text-muted" href="#">Privacy</a></li>
                <li><a class="text-muted" href="#">Terms</a></li>
            </ul>
            </div>
        </div>
        </footer>
</body>

</html>

base.html 代码也有 href="{% url 'cart' %}" 的 url.py

path('cart',views.cart_list,name='cart'),

views.py 具有以上 cart_list.html 是 -

# Cart List Page
def cart_list(request):
    total_amt=0
    if 'cartdata' in request.session:
        for p_id,item in request.session['cartdata'].items():
            total_amt+=int(item['qty'])*float(item['price'])
        return render(request, 'cart.html',{'cart_data':request.session['cartdata'],'totalitems':len(request.session['cartdata']),'total_amt':total_amt})
    else:
        return render(request, 'cart.html',{'cart_data':'','totalitems':0,'total_amt':total_amt})

【问题讨论】:

  • 你能分享cart.html模板和渲染它的视图的代码吗?
  • 添加了购物车.html,如果有帮助的话,还可以在一定程度上增加流量....

标签: django templates


【解决方案1】:

我尝试了一些东西,有些工作有些没有 - 我觉得做的方法是在会话中保存品牌标识,就像下面一样点击网址 -

# Product List as per Brand1
def brand_product_list(request,brand_id):
    request.session['prod_brand'] = brand_id
    brandid = brand_id
    brand_b=Brand.objects.get(id=brand_id)    
    cats_b=Product.objects.filter(brand=brand_b).distinct().values('category__title','category_id')
    data_b=Product.objects.filter(brand=brand_b).order_by('-id')
    colors_b=ProductAttribute.objects.filter(brand=brand_b).distinct().values('color__title','color__id','color__color_code')
    sizes_b=ProductAttribute.objects.filter(brand=brand_b).distinct().values('size__title','size__id')
    flavors_b=ProductAttribute.objects.filter(brand=brand_b).distinct().values('flavor__title','flavor__id')
    
    return render(request,'brand_product_list.html',
    {
        'data_b':data_b,
        'brandid':brandid,
        'cats_b':cats_b,
        'brand_b':brand_b,
        'sizes_b':sizes_b,
        'colors_b':colors_b,
        'flavors_b':flavors_b,
        'prodbrand':request.session['prod_brand'],
    })

【讨论】:

    猜你喜欢
    • 2013-07-27
    • 2015-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-07
    • 1970-01-01
    • 2013-05-12
    相关资源
    最近更新 更多