Django render не может найти шаблон, который действительно существует - PullRequest
2 голосов
/ 26 сентября 2019

У меня есть следующий вид в моем проекте Django:

import os
from django.shortcuts import render
from JumboDjango import settings

# Create your views here.
def index(request):
    filename = os.path.join(settings.BASE_DIR, 'frontend/source/public/index.html')
    return render(request, filename)

Но, когда он вызывается, он вызывает следующее исключение:

Internal Server Error: /
Traceback (most recent call last):
  File "/Users/hugovillalobos/Documents/Code/JumboDjangoProject/JumboDjangoVenv/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/Users/hugovillalobos/Documents/Code/JumboDjangoProject/JumboDjangoVenv/lib/python3.7/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/Users/hugovillalobos/Documents/Code/JumboDjangoProject/JumboDjangoVenv/lib/python3.7/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/hugovillalobos/anaconda3/lib/python3.7/contextlib.py", line 74, in inner
    return func(*args, **kwds)
  File "/Users/hugovillalobos/Documents/Code/JumboDjangoProject/JumboDjango/frontend/views.py", line 8, in index
    return render(request, filename)
  File "/Users/hugovillalobos/Documents/Code/JumboDjangoProject/JumboDjangoVenv/lib/python3.7/site-packages/django/shortcuts.py", line 36, in render
    content = loader.render_to_string(template_name, context, request, using=using)
  File "/Users/hugovillalobos/Documents/Code/JumboDjangoProject/JumboDjangoVenv/lib/python3.7/site-packages/django/template/loader.py", line 61, in render_to_string
    template = get_template(template_name, using=using)
  File "/Users/hugovillalobos/Documents/Code/JumboDjangoProject/JumboDjangoVenv/lib/python3.7/site-packages/django/template/loader.py", line 19, in get_template
    raise TemplateDoesNotExist(template_name, chain=chain)
django.template.exceptions.TemplateDoesNotExist: /Users/hugovillalobos/Documents/Code/JumboDjangoProject/JumboDjango/frontend/source/public/index.html
[26/Sep/2019 02:51:04] "GET / HTTP/1.1" 500 79956

Вы можете увидеть следующееизображение, которое /Users/hugovillalobos/Documents/Code/JumboDjangoProject/JumboDjango/frontend/source/public/index.html действительно существует:

enter image description here

Я не знаю, пропускаю ли я какую-либо конфигурацию Django или что-то в этом роде.

РЕДАКТИРОВАТЬ

Это мои настройки шаблона:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        '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',
            ],
        },
    },
]

Ответы [ 2 ]

1 голос
/ 26 сентября 2019

Прежде всего, вы всегда должны хранить html-файлы и статические файлы (css, js, json) отдельно.

для меня это хороший подход, который я всегда использую.Для файлов HTML определите каталог шаблонов в папке проекта.

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        .
        .
        .

    },
]

Эта папка templates должна находиться в каталоге проекта.внутри этой папки вы можете создать папку для своих приложений или чего-либо еще.Как и в текущем случае, папка public внутри templates и html-файл внутри нее.Вы можете получить доступ к этому файлу следующим образом:

return render(request, 'public/index.html')

--- Редактировать ------

Для условия в этом вопросе, если public - это папка, в которой у нас будут все html-файлы, а JumboDjango - это каталог проекта, затем:

settings.py

TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(BASE_DIR, 'frontend/source/public/')],
            .
            .
            .

        },
    ]

views.py

return render(request, 'index.html')

, если мы создадим другую папку внутри public , например folder1 , тогда

return render(request, 'folder1/index.html')

Но отдельная папка для статических файлов необходима.

0 голосов
/ 26 сентября 2019

Вам необходимо добавить каталог в ваши настройки TEMPLATES с помощью клавиши DIRS.

Это позволяет обработчику шаблонов Django искать файлы шаблонов в этой папке.Например, если ваш каталог шаблонов /Users/hugovillalobos/Documents/Code/JumboDjangoProject/JumboDjango/frontend/source

Так что вам нужно добавить его, как показано ниже, к DIRS

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
             "/Users/hugovillalobos/Documents/Code/JumboDjangoProject/JumboDjango/frontend/source"
        ],
        ...
        ...
    },
]

Вам необходимо отобразить шаблон, указав относительный путь кметод render.

import os
from django.shortcuts import render
from JumboDjango import settings

# Create your views here.
def index(request):
    return render(request, "public/index.html")  # Add a relative path to your template folder here.
...