Джанго-Аллах загружает неверный шаблон 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 будет использовать этот стиль, который во многих случаях кажется хорошим.

Другие вопросы по тегам