Я занимаюсь разработкой сайта электронной коммерции с помощью django -oscar. Я решил использовать теги шаблонов и панель инструментов oscar, пытаясь изменить только шаблоны своими.
Мне очень жаль, что описание вопроса слишком длинное, но я полагаю, что вам нужно понять мой рабочий процесс, чтобы понять проблему. В приведенном ниже описании я начинаю со своих базовых c настроек и интеграции шаблонов и прохожу путь к каталогу. html, где я сталкиваюсь с проблемой. Моя основная формулировка проблемы выделена жирным шрифтом
Я разбудил приложение для каталога oscar своим собственным. Прямо сейчас мой settings.py
выглядит следующим образом:
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMPLATES_DIR = os.path.join(BASE_DIR, 'templates/local')
OSCAR_TEMP_DIR = os.path.join(BASE_DIR, 'templates/oscar')
TEMP_DIR = os.path.join(BASE_DIR, 'templates')
STATIC_ROOT = os.path.join(BASE_DIR,'allstatic')
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static_in_env'),]
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.sites',
'django.contrib.flatpages',
#Custom Made Apps
'appdir.catalogue.apps.CatalogueConfig',
#Oscar Apps
'oscar',
'oscar.apps.analytics',
'oscar.apps.checkout',
'oscar.apps.address',
'oscar.apps.shipping',
# 'oscar.apps.catalogue',
'oscar.apps.catalogue.reviews',
'oscar.apps.partner',
'oscar.apps.basket',
'oscar.apps.payment',
...
]
SITE_ID = 1
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [TEMPLATES_DIR, OSCAR_TEMP_DIR, TEMP_DIR],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
'oscar.apps.search.context_processors.search_form',
'oscar.apps.checkout.context_processors.checkout',
'oscar.apps.customer.notifications.context_processors.notifications',
'oscar.core.context_processors.metadata',
],
},
},
]
У меня есть свои собственные шаблоны, которые я интегрировал в приложение путем создания подкласса родительской базы. html т.е. базы оскара. html:
Моя база. html живет внутри project_dir/templates/local
# base.html
{% extends 'oscar/base.html' %}
...
Я пытаюсь создать страницу каталога товаров, которая демонстрирует все товары. Я могу просматривать продукты в базе данных на приборной панели оскара и даже на странице администратора. Однако он не отображает страницу product.htm
l, которую я пытаюсь использовать на сайте с песочницей.
Вот как выглядит мой каталог. html.
{% extends "category-base.html" %}
{% load basket_tags %}
{% load category_tags %}
{% load product_tags %}
{% load i18n %}
{% block header %}
...
{% endblock header %}
<main>
{% block column_left %}
<div class="block">
{% category_tree as tree_categories %}
{% if tree_categories %}
<h6 class="text-uppercase">Product Categories</h6>
<ul class="list-unstyled">
{% for tree_category in tree_categories %}
<li>
<a href="{{ tree_category.url }}" class="d-flex justify-content-between align-items-center">
{% if tree_category.pk == category.pk %}
<span>{{ tree_category.name }}</span>
{% else %}
<span>{{ tree_category.name }}</span>
{% endif %}
</a>
{% if tree_category.has_children %}
<ul class="list-unstyled">
{% else %}
</li>
{% endif %}
{% comment %} #num_to_close A list indicating the number of leaf branches that
this category terminates.
{% endcomment %}
{% for n in tree_category.num_to_close %}
</ul>
</li>
{% endfor %}
{% endfor %}
</ul>
{% endif %}
</div>
<!--/Left Column Ends-->
{% endblock column_left %}
<!-- Main Content Panel -->
{% block column_right %}
<form method="get" class="form-horizontal">
...
</form>
<!--Main Content-->
{% if products %}
<section>
<div>
<ol class="row">
{% for product in products %}
<li class="col-xs-6 col-sm-4 col-md-3 col-lg-3">{% render_product product %}</li>
{% endfor %}
</ol>
{% include "oscar/partials/pagination.html" %}
</div>
</section>
{% else %}
<p class="nonefound">{% trans "No products found." %}</p>
{% endif %}
<!--/Main Content-->
{% endblock column_right %}
Здесь дерево категорий в блоке 'column_left' отображается идеально в соответствии с иерархией каталога. Однако теги шаблона продукта внутри блока column_right ничего не дают. Я проверил сайт с песочницей, и все загруженные продукты отображаются на нем.
Однако, тег {% if products %}
yields передает управление else, а <p class="nonefound">{% trans "No products found." %}</p>
отображается.
Oscar product_tags.py внутри projectenv/lib/site-packages/oscar/templatetags/
выглядит следующим образом:
@register.simple_tag(takes_context=True)
def render_product(context, product):
"""
Render a product snippet as you would see in a browsing display.
This templatetag looks for different templates depending on the UPC and
product class of the passed product. This allows alternative templates to
be used for different product classes.
"""
if not product:
# Search index is returning products that don't exist in the
# database...
return ''
names = ['oscar/catalogue/partials/product/upc-%s.html' % product.upc,
'oscar/catalogue/partials/product/class-%s.html'
% product.get_product_class().slug,
'oscar/catalogue/partials/product.html']
template_ = select_template(names)
context = context.flatten()
# Ensure the passed product is in the context as 'product'
context['product'] = product
return template_.render(context)
Я проверил oscar / catalog / partials / products. html и не смог найти в нем ничего плохого :
{% load display_tags %}
{% load i18n %}
{% load image_tags %}
{% load reviews_tags %}
{% block product %}
<article class="product_pod">
{% block product_image %}
<div class="image_container">
{% with image=product.primary_image %}
{% oscar_thumbnail image.original "x155" upscale=False as thumb %}
<a href="{{ product.get_absolute_url }}">
<img src="{{ thumb.url }}" alt="{{ product.get_title }}" class="thumbnail">
</a>
{% endwith %}
</div>
{% endblock %}
{% block product_review %}
{% iffeature "reviews" %}
<p class="star-rating {{ product.rating|as_stars }}">
<i class="icon-star"></i>
<i class="icon-star"></i>
<i class="icon-star"></i>
<i class="icon-star"></i>
<i class="icon-star"></i>
</p>
{% endiffeature %}
{% endblock %}
{% block product_title %}
<h3><a href="{{ product.get_absolute_url }}" title="{{ product.get_title }}">{{ product.get_title|truncatewords:4 }}</a></h3>
{% endblock %}
{% block product_price %}
<div class="product_price">
{% include "oscar/catalogue/partials/stock_record.html" %}
{% if not product.is_parent and not product.has_options %}
{% include "oscar/catalogue/partials/add_to_basket_form_compact.html" %}
{% endif %}
</div>
{% endblock %}
</article>
{% endblock %}
Я не понимаю, почему продукты не отображаются или где проблема. Если бы в тегах шаблонов была ошибка, я бы получил предупреждение при отладке. Я думаю, что проблема заключается в странице product.html
или в выражении {% if products%}
, но я не могу точно выяснить.
Кроме того, любые критические отзывы и советы по передовой практике будут высоко оценены.