django 我如何整合奥斯卡的产品渲染模板标签与我自己的模板?

wtzytmuj  于 2023-02-17  发布在  Go
关注(0)|答案(1)|浏览(148)

我在django-oscar的帮助下开发了一个电子商务网站,我决定使用oscar的模板标签和 Jmeter 板,同时只使用我自己的模板。

  • 很抱歉问题描述太长,但我认为您需要了解我的工作流程才能理解问题。在下面的描述中,我从基本设置和模板集成开始,一直到catalogue.html,这就是我面临的问题。我的主要问题陈述以粗体显示 *

我已经把奥斯卡的catalogue应用程序和我自己的分开了,现在我的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',
            ],
        },
    },
]

我有我自己的模板,我已经集成到应用程序的子类父base.html即奥斯卡的base.html:
我的base.html位于project_dir/templates/local

# base.html
{% extends 'oscar/base.html' %}

...

我正在尝试创建一个产品目录页面,展示所有产品。我可以从奥斯卡的 Jmeter 板,甚至管理员页面查看数据库中的产品。但是,它无法呈现我正在尝试使用的沙盒网站的product.htm l页面。

下面是我的catalogue.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 %}标记产生将控制传递给else并呈现<p class="nonefound">{% trans "No products found." %}</p>

Oscar在projectenv/lib/site-packages/oscar/templatetags/中的product_tags.py如下所示:

@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/catalogue/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%}语句,但我不能确切地找出。
此外,对良好做法的任何重要反馈和建议都将受到高度赞赏。

8cdiaqws

8cdiaqws1#

我尝试做和你一样的事情,但是它不是这样工作的。与其创建你自己的商店页面,不如尝试修改默认情况下已经存在的商店页面(来自奥斯卡)我想应该叫browse.html(templates/奥斯卡/目录/浏览器. html).此页面(以及来自文件夹模板的其余页面)包含多个部分,你需要进入其中的每一个,只需改变CSS,使它看起来像你想要的。在partials/productiderhtml中只是产品卡,而不是整个商店页面,也就是browse.html。Oscar页面继承了部分代码。它就是这样构建的。

相关问题