Джанго-Аллах загружает неверный шаблон base.html
Я пытался заставить Джанго Аллаута работать в течение пары дней, и я наконец узнал, что происходит.
Вместо загрузки base.html
шаблон, который устанавливается с помощью django-allauth, приложение загружает base.html
файл, который я использую для остальной части моего сайта.
Как мне сказать django-allauth использовать шаблон base.html в virtualenv/lib/python2.7/sitepackages/django-allauth
каталог вместо моего project/template
каталог?
4 ответа
Если не вызвано напрямую, ваш base.html
является расширением шаблонов, которые вы определяете.
Например, если вы визуализируете шаблон с именем Page.html
- на вершине у вас будет {% extends "base.html" %}
,
Когда определено как указано выше, base.html
находится на пути, который вы определили в вашем settings.py
под TEMPLATE_DIRS = ()
- который, по вашему описанию, определяется как project/template
,
Лучше всего скопировать Джанго Аллаута base.html
файл в определенный TEMPLATE_DIRS
местоположение, переименуйте его в allauthbase.html
, а затем расширить ваши шаблоны, чтобы включить его вместо базы по умолчанию через {% extends "allauthbase.html" %}
,
В качестве альтернативы вы можете добавить подпапку к вашему шаблону, например project/template/allauth
Поместите Аллаута base.html
там, а затем использовать {% extends "allauth/base.html" %}
,
У меня была противоположная проблема: я пытался использовать свой собственный base.html
файл, но мой проект Django захватывал django-allauth
версия base.html
, Оказывается, порядок вы определяете INSTALLED_APPS
в settings.py
влияет на то, как шаблоны отображаются. Для того, чтобы мой base.html
сделать вместо того, что определено в django-allauth
Мне нужно было определить INSTALLED_APPS
в дальнейшем:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# custom
'common',
'users',
'app',
# allauth
'django.contrib.sites',
'allauth',
'allauth.account',
'allauth.socialaccount',
]
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
Два года спустя это продолжает оставаться проблемой, и в принятом ответе отсутствует какая-то новая информация.
На github я обнаружил, что все шаблоны allauth являются производными от account / base.html, который происходит от base.html. Мое решение было:
- В
virtualenv/lib/python2.7/sitepackages/django-allauth/templates
, скопируйте все содержимоеbase.html
заменить все вaccount/base.html
(т.е. заменить{% extends 'base.html' %}
заявление) - Удалить Аллаута
base.html
, Теперь это избыточно.
Готово!
Все предоставленные ответы вынуждают вас переписывать файлы и изменять свой собственный проект, чтобы он соответствовал Аллаху, что является совершенно неприемлемым рабочим процессом. Такое стороннее приложение не должно иметь такой манипулятивной власти над вашим собственным проектом.
Действительно, самый простой способ справиться с этой ситуацией, особенно на основе предоставленных ответов, - просто переместить приложение allauth и связанные с ним приложения в конец вашего INSTALLED_APPS
список в вашем settings.py
файл. Джанго найдет ваш base.html
шаблон, прежде чем он находит другой base.html
шаблон в других приложениях, перечисленных ниже.
Задача решена.
Allauth
пытается продлить myproject/templates/base.html
, Самые простые способы - это двигаться base.html
в myproject/templates/site/
чтобы получить myproject/templates/site/base.html
или просто переименовать base.html
django-allauth
шаблоны, кажется, расширяются account/base.html
( пример), который расширяет base.html
,
Так копировать base.html
например myapp/templates/account/base.html
и убедитесь, что myapp
загружает до django-allauth
(поместив его выше в INSTALLED_APPS
).
Теперь шаблоны авторизации Django расширят ваш account/base.html
, которые будут django-allauth
"s base.html
,
Это не идеально, так как django-allauth
"s base.html
может обновить, и вы пропустите эти обновления. Но это кажется лучше, чем переименование всего вашего импорта или изменение django-allauth
код.
Обратите внимание, что вы также можете просто поставить {% block content %}
в вашем base.html
вокруг содержания, а затем django-allauth
будет использовать этот стиль, который во многих случаях кажется хорошим.