Django复制块.超级内容

ebdffaop  于 2023-01-06  发布在  Go
关注(0)|答案(2)|浏览(112)

在模板继承中使用,就像在这里的文档中一样,我得到了如下所示的复制:

在上面的照片中,Google Tag Manager的注解文本被复制了。显然我想把实际的Tag Manager放在那里,但这样做对SO来说是一个更简单的例子。当我调用{{ base.super }}我正在使用Oscar时,我放在我的子模板标记中的任何东西都被复制了,所以这里是我的继承方案。
oscar/base.html

#from oscar module
#relevent sections only

{% load i18n %}
{% load static %}
<!DOCTYPE html>
<html lang="{{ LANGUAGE_CODE|default:"en-gb" }}" class="{% block html_class %}no-js{% endblock %}">
    <head>
        {% block tracking %}
            {# Default to using Google analytics #}
            {% include "oscar/partials/google_analytics.html" %}
        {% endblock %}
    </head>

我的基地覆盖

# located in my procject at 'oscar/base.html'
{% extends 'oscar/base.html' %}

{% block tracking %}
    {{ block.super }}
    <!-- Google Tag Manager -->
    <!-- End Google Tag Manager -->
{% endblock %}

下面是我认为可能涉及的任何其他问题。任何有助于我调试此问题的故障排除技巧都是受欢迎的。
我的看法

from django.http import HttpResponse
from django.views.generic.base import TemplateView

class BaseTestView(TemplateView):
    template_name = "oscar/base.html"

urls.py

from myurls import BaseTestView
urlpatterns = [
    path('i18n/', include('django.conf.urls.i18n')),
    path('admin/', admin.site.urls),
    
    path('base_test', BaseTestView.as_view(), name='base+test'),
    
    ##OSCAR###############################################################
    path('', include(apps.get_app_config('oscar').urls[0])),

    ##WAGTAIL#############################################################
    path('cms/', include(wagtailadmin_urls)),
    path('documents/', include(wagtaildocs_urls)),
    path('pages/', include(wagtail_urls)),
    
    
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) \
    + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

settings.py templates

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            location('templates'),
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                ####DEFAULT################################################
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',

                ####DEFAULT################################################
                # 'uniquesite.context_processors.metadata',
                
                ####OSCAR################################################
                'oscar.apps.search.context_processors.search_form',
                'oscar.apps.checkout.context_processors.checkout',
                'oscar.apps.communication.notifications.context_processors.notifications',
                'oscar.core.context_processors.metadata',
            ],
        },
    },
]
e1xvtsh3

e1xvtsh31#

看起来你只是在扩展你自己的模板。看起来你在使用Oscar文档中How to customise templates中描述的方法1,它涉及到简单地复制他们的模板并修改它们。
但是你表现得好像你在使用方法2。我相信最简单的解决方案是复制他们的模板而不是扩展它,或者你可以看看使用他们文档中描述的方法2,他们使用父目录技巧。或者作为方法2中给出的替代选项,使用django-overextends

6kkfgxo0

6kkfgxo02#

我也遇到过类似的问题,这是因为我在设置TEMPLATES var中两次包含模板路径。
对您来说,这可能是因为您有以下两个设置。您可能可以删除第一个:

TEMPLATES = [
        ...
        'DIRS': [
            location('templates'),
        ],
        'APP_DIRS': True,
         ...
]

当模板被包含两次时,extends 'oscar/base.html'首先从你自己的模板目录导入oscar/base.html agaon,只有这样才包含实际的模板,但是现在我们在html中有两个{% block tracking %}

相关问题