Django ищет шаблоны в моей папке .envs (+ Django Admin)

У меня настроены папки так:

~/projects/myproject/
~/.envs/myproject/

Папки моего приложения выглядят так:

myapp/
├── __init__.py
├── admin.py
├── forms.py
├── migrations/
├── models.py
├── tests/
├── templates/
├── urls.py
├── views.py

Я только что реализовал собственный вид сброса пароля, потому что хотел использовать свои собственные шаблоны. Проблема в том, что вид сброса пароля не находит мой шаблон. Вот мой взгляд:

class CustomPasswordResetConfirmView(views.PasswordResetConfirmView):
    success_url = reverse_lazy("accounts:password_reset_complete")
    template_name = "accounts/registration/password_reset_confirm.html"

И вот сообщение об ошибке, которое я получаю:

TemplateDoesNotExist at /auth/reset/MQ/set-password/
accounts/registration/password_reset_confirm.html.
Request Method: GET
Request URL:    http://localhost:8000/auth/reset/MQ/set-password/
Django Version: 1.11.13
Exception Type: TemplateDoesNotExist
Exception Value:    
accounts/registration/password_reset_confirm.html.
Exception Location: /Users/jan/.envs/myproject/lib/python3.6/site-packages/django/template/loader.py in select_template, line 53
Python Executable:  /Users/jan/.envs/myproject/bin/python
Python Version: 3.6.5
Python Path:    
['/Users/jan/Dev/Misc Tutorial/myproject',
 '/Users/jan/.envs/myproject/lib/python36.zip',
 '/Users/jan/.envs/myproject/lib/python3.6',
 '/Users/jan/.envs/myproject/lib/python3.6/lib-dynload',
 '/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6',
 '/Users/jan/.envs/myproject/lib/python3.6/site-packages']

Как я могу заставить Django найти мои пользовательские шаблоны? Из ошибки могу сказать, что он смотрит в моих виртуальных средах.

Я попытался указать путь к шаблонам следующим образом:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            [os.path.join(BASE_DIR, 'templates')]
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.contrib.auth.context_processors.auth',
                'django.template.context_processors.debug',
                'django.template.context_processors.i18n',
                'django.template.context_processors.media',
                'django.template.context_processors.static',
                'django.template.context_processors.tz',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

Код для этого я получил из документации Django. К сожалению, это не помогает. Если у вас есть идеи, как я могу это исправить, я был бы очень благодарен!

(Кстати, я также пытался использовать django-admin вместо manage.py, потому что это рекомендуется официальной документацией. Но я не смог установить переменную env DJANGO_SETTINGS_MODULE, чтобы она работала. Возможно, эта проблема связана.)

РЕДАКТИРОВАТЬ: приложение для вещей, связанных с учетной записью, называется учетными записями. В нем есть папка с названием «шаблоны», содержащая различные другие папки, одна из которых называется «регистрация».


person J. Hesters    schedule 11.05.2018    source источник
comment
У вас есть лишний . в конце имени вашего шаблона. Но ваш вопрос не ясен; где шаблон, который вы пытаетесь использовать? Единственное приложение, которое вы показываете, называется myapp; у вас есть отдельное приложение учетных записей? Есть ли у него каталог шаблонов/регистрации?   -  person Daniel Roseman    schedule 11.05.2018
comment
@DanielRoseman Спасибо за вашу помощь. Да, я удалил точку, все равно выдает ту же ошибку. И да, у меня есть приложение для отдельных учетных записей. Добавлено в вопрос для контекста. Вы также правы, что в приложении учетных записей есть каталог шаблонов/регистрации. Я только что назвал пример приложения myapp.   -  person J. Hesters    schedule 11.05.2018
comment
Из документации: manage.py делает то же самое, что и django-admin, но заботится о нескольких вещах за вас: 1) Он помещает пакет вашего проекта в sys.path. 2) Он устанавливает переменную среды DJANGO_SETTINGS_MODULE так, чтобы она указывала на файл settings.py вашего проекта. Перейдя к manage.py, вы можете упростить настройку своего проекта Django.   -  person pydanny    schedule 12.05.2018
comment
Спасибо @pydanny. Тогда я собираюсь использовать manage.py! А знаете ли вы, что может заставить Django искать шаблоны только внутри папки .envs?   -  person J. Hesters    schedule 13.05.2018
comment
Не видя всего исходного кода, я не могу понять, почему.   -  person pydanny    schedule 20.05.2018


Ответы (2)


Типа решил.

Обошел проблему django-admin с помощью manage.py, как было предложено pydanny.

И я просто неправильно настроил свои шаблоны. Вот новый вид, который я использовал:

class CustomPasswordResetConfirmView(views.PasswordResetConfirmView):
    success_url = reverse_lazy("accounts:password_reset_complete")
    template_name = "registration/password_reset_confirm.html"

Я также помещаю папку шаблона в корень моего проекта следующим образом:

myproject
  accounts/
  ...
  myproject/
  templates/

Папка registration/ теперь находится в этом каталоге templates/.

Вместе со следующими настройками теперь все работает, спасибо всем, кто помог!

Настройки:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        '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',
            ],
        },
    },
]
person J. Hesters    schedule 14.05.2018

Django также искал шаблоны в моем каталоге venv (моем каталоге виртуальной среды), в моем случае я решил это после того, как добавил свое приложение в файл настроек основного каталога проекта.

По сути, в вашем каталоге приложений есть файл apps.py, в котором есть класс с именем *YOURAPPNAME*Config. В моем случае приложение — это учетные записи, поэтому класс — AccountsConfig. Затем перейдите в каталог основного проекта, который находится в том же каталоге, что и ваш файл manage.py, откройте settings.py, прокрутите вниз до INSTALLED_APPS и добавьте туда свой класс. Для меня это было бы accounts.apps.AccountsConfig

person fghtclb    schedule 01.08.2020
comment
Это возможно хороший ответ, но было бы полезно, если бы вы объяснили свой ответ более подробно. КАКОЙ файл настроек, в КАКОМ расположении и КАК вы его добавили? - person Deven Phillips; 01.08.2020
comment
Вам не нужно выделять свое редактирование с помощью Edit:. Под вашим ответом есть ссылка на историю редактирования, которая покажет, что было добавлено. Привет и добро пожаловать в SE.SO кстати... :-) - person Greenonline; 01.08.2020