Контекст рендеринга Django для шаблона заголовка?

#python #django

#python #django

Вопрос:

Вот мой main.html , в настоящее время я включаю верхний и нижний колонтитулы

 {% include "store/header.html" %}

{% block content %}

{% endblock content %}

{% include "store/footer.html" %}```
 

мой header.html пример: здесь я пытаюсь отобразить свою корзину

 <div class="shopping__cart">
        <div class="shopping__cart__inner">
            <div class="offsetmenu__close__btn">
                <a href="#"><i class="zmdi zmdi-close"></i></a>
            </div>
            <div class="shp__cart__wrap">
                {% for item in items %}
                <div class="shp__single__product">
                    <div class="shp__pro__thumb">
                        <a href="#">
                            <img src="{{item.product.imageURL}}" alt="product images">
                        </a>
                    </div>
                    <div class="shp__pro__details">
                        <h2><a href="product-details.html">{{item.product.title}}</a></h2>
                        <span class="quantity">QTY: {{item.quantity}}</span>
                        <span class="shp__price">${{item.product.price|floatformat:2}}</span>
                    </div>
                    <div class="remove__btn">
                        <a href="#" title="Remove this item"><i class="zmdi zmdi-close"></i></a>
                    </div>
                </div>
                {% endfor %}
            </div>
            <ul class="shoping__total">
                <li class="subtotal">Subtotal:</li>
                <li class="total__price">${{order.get_cart_total|floatformat:2}}</li>
            </ul>
            <ul class="shopping__btn">
                <li><a href="cart.html">View Cart</a></li>
                <li class="shp__checkout"><a href="checkout.html">Checkout</a></li>
            </ul>
        </div>
    </div>
 

Я пытаюсь отобразить товары в своей корзине.

вот мое мнение:

 def header(request):
    category = None
    categories = Category.objects.all()
    products = Product.objects.all()
    
    if category_slug:
        category = get_object_or_404(Category, slug=category_slug)
        products = products.filter(category=category)

    data = cartData(request)
    
    cartItems = data['cartItems']
    order = data['order']
    items = data['items']
    
    context = {'items':items, 'order':order, 'cartItems':cartItems, 'categories':categories, 'products':products, 'category': category}
    return render(request, 'store/header.html', context)
 

но я не уверен, как его отобразить, поскольку это всего лишь заголовок. возможно, мне следует подойти к нему по-другому в представлениях.

Ответ №1:

Вы можете использовать теги шаблонов. В Django есть теги шаблонов для выполнения сложных операций в шаблонах.

Что вы можете сделать, так это создать пользовательский тег шаблона, который будет принимать пользователя в качестве входных данных и возвращать набор запросов товаров корзины, который вы можете сохранить в переменной, а затем перебирать его для отображения всех товаров.

В myprojectdir/app_name/templatetags/cart.py

     from django import template
    from myapp.models import Customer

    register = template.Library()

    @register.simple_tag
    def get_cart_items(user):
        //Implement the filter logic to get the cart items for the user and then return th queryset
        cart = Cart.objects.filter(user=user)
        return cart
 

Затем внутри вашего шаблона вы можете сделать это

 {% load cart %}

{% get_cart_items request.user as cart_items %}

{% for item in cart_items %}
   <Your html code>
{% endfor %}

 

Поскольку Django автоматически передает request in контекст всем шаблонам, вы должны получить доступ к текущему пользователю с помощью request.user .

Чтобы понять, где создать файл тега шаблона, обратитесь к этому https://docs.djangoproject.com/en/3.1/howto/custom-template-tags/#code-layout

Для получения дополнительной информации о тегах шаблонов обратитесь к этому:

Вы также можете использовать тег включения вместо простого тега для большей гибкости и возможности повторного использования кода.