Как сделать переменную url доступной для всех шаблонов
У меня есть конкретное требование - скажем, я ввожу url, как показано ниже -
http://127.0.0.1:8000/brand_product_list/1
В приведенном выше url последняя 1 - это brand-id, и мне нужно, чтобы этот brand-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, который вызывается при нажатии на кнопку cart в base.html, который расширяется в brand_product_list.html
Дело в том, что поскольку base.html расширен в brand_product_list.html, brandid доступен в base.html (значит дочерняя переменная доступна в родительской) и я могу фильтровать товары по бренду, но почему-то когда я нажимаю на кнопку корзины в base.html, тот же brandid не попадает в cart.html, хотя base.html расширен в 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 с запросом и одним аргументом? Или каким-то другим способом...
Я пробовал разные вещи, некоторые работали, некоторые нет - я чувствую, что способ сделать это сохранить brandid в сессии, в тот момент, когда url нажимается, как показано ниже -
# 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'],
})