首页 > 解决方案 > Django 正在从错误的应用程序加载模板

问题描述

我的电子学习应用程序下有一个名为 home() 的视图,它应该从应用程序的目录中加载 index.html。相反,它从不同的应用程序 (symposium/templates/index.html) 加载 index.html 的实例。它应该从 (elearning/templates/index.html) 加载它。

有人可以解释为什么会发生这种情况以及如何解决吗?

# Settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
        # Machina dependencies:
    'mptt',
    'haystack',
    'widget_tweaks',

    # Machina apps:
    'machina',
    'machina.apps.forum',
    'machina.apps.forum_conversation',
    'machina.apps.forum_conversation.forum_attachments',
    'machina.apps.forum_conversation.forum_polls',
    'machina.apps.forum_feeds',
    'machina.apps.forum_moderation',
    'machina.apps.forum_search',
    'machina.apps.forum_tracking',
    'machina.apps.forum_member',
    'machina.apps.forum_permission',
    # SCORM apps:
    'accounts',
    'symposium',
    'elearning']

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR,'templates'), MACHINA_MAIN_TEMPLATE_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',
                'machina.core.context_processors.metadata',
            ],
        },
    },
]
# root urls.py
from django.contrib import admin
from django.urls import path, include
from machina import urls as machina_urls
from accounts.views import CreateUser
from django.conf.urls.static import static
from django.conf import settings

urlpatterns = [
    path('forum/',include(machina_urls)),
    path('admin/', admin.site.urls),
    path('createuser',CreateUser.as_view()),
    path('symposium/', include('symposium.urls')),
    path('elearning/', include('elearning.urls')),
]
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
# elearning app urls.py
from django.urls import include, path
from . import views

app_name = 'elearning'

urlpatterns = [
    path('', views.home, name='home'),
]
# app: elearning/views.py
from django.shortcuts import render

# Create your views here.
def home(request):
    return render(request,'index.html',{})
# index.html location
elearning templates : ./elearning/templates/index.html

标签: pythondjango

解决方案


Django 在每个应用程序中搜索模板文件夹,以获取要呈现的相关模板。看起来它发现的第一个index.html来自symposium应用程序。

模板目录结构的约定是将模板放在具有应用程序名称的另一个文件夹中,以避免使用同名模板时出现这种情况。

将您的index.html文件从

/elearning/templates/index.html

/elearning/templates/elearning/index.html

然后将您的主页视图功能更改为

def home(request):
    return render(request,'elearning/index.html',{})

同样对应用程序中index.html文件的位置执行相同的操作symposium


推荐阅读