Как переопределить шаблон в django-allauth?
Ответы в других вопросах оставляют впечатление, что это на самом деле очень просто:
Однако я не могу заставить его работать вообще.
Из пример настроек приложения Я вижу, что django-allauth предположительно ожидает, что его шаблоны будут находиться в account
, openid
и socialaccount
. Но когда я помещаю шаблон в TEMPLATE_DIR/account/signup.html
, он не загружается, signup
отображает шаблон, связанный с django-allauth. Что мне не хватает?
Ответы
Ответ 1
В конечном итоге я прибегал к загрузке моего приложения перед django-allauth. В settings.py
:
INSTALLED_APPS = (
...
'myapp',
'allauth',
'allauth.account'
)
Это решение противоречит тому, что представлено в примере приложения, но я не смог его решить иначе.
Ответ 2
Adding a template directory for allauth in template dirs
сделает трюк. В Django 1.8 его можно сделать, отредактировав настройки dir шаблона TEMPLATES
следующим образом.
'DIRS': [os.path.join(BASE_DIR, 'templates'), os.path.join(BASE_DIR, 'templates', 'allauth')],
Я думаю, что ниже код будет работать с другими версиями django
TEMPLATE_DIRS = (
os.path.join(BASE_DIR,'templates'), os.path.join(BASE_DIR,'templates', 'allauth'))
Ответ 3
По сей день --- мы сейчас на Django-1.10.5 --- django-allauth docs остаются самыми бесполезными на этот счет. Кажется, что Django просматривает в каталоге шаблонов первое приложение, указанное во время DIRS
in TEMPLATES
in settings.py
. Я предоставляю ответ только для того, чтобы помочь вам реализовать ответ Адама Старра, чтобы помочь с обратными URL-адресами (я получил ошибки, пока не позаботился о них).
В файле urls.py поставьте:
from allauth.account.views import SignupView, LoginView, PasswordResetView
class MySignupView(SignupView):
template_name = 'signup.html'
class MyLoginView(LoginView):
template_name = 'login.html'
class MyPasswordResetView(PasswordResetView):
template_name = 'password_reset.html'
urlpatterns = [
url(r'^accounts/login', MyLoginView.as_view(), name='account_login'),
url(r'^accounts/signup', MySignupView.as_view(), name='account_signup'),
url(r'^accounts/password_reset', MyPasswordResetView.as_view(), name='account_reset_password'),
]
В настоящее время файл views.py здесь, поэтому вы можете расширить его до других шаблонов.
Я должен добавить, что вам все еще нужно в TEMPLATES
, что-то вроде:
'DIRS': [
os.path.join(PROJECT_ROOT, 'templates', 'bootstrap', 'allauth', 'account'),
],
И в этом примере это будет, если ваши шаблоны находятся в /templates/bootstrap/allauth/account
, что они в моем случае. А:
PROJECT_ROOT = os.path.normpath(os.path.dirname(os.path.abspath(__file__)))
ИЗМЕНИТЬ... ПРАВИЛЬНЫЙ ПУТЬ:
ОК, выше работает, до точки, и хорошо, что он напрямую устанавливает шаблон в соответствии с тем, что вы хотите. Но как только вы включите социальные приложения, вы начнете получать обратные url-ошибки, например, для dropbox_login
, для которых вы не предоставили именованный вид.
После прочтения комментария Бурхана Халида fooobar.com/questions/207871/..., который был обнаружен исследователем, я в конце концов обнаружил, что следующие работы:
'DIRS': [
os.path.join(PROJECT_ROOT, 'templates', 'example'),
]
И это дает /home/mike/example/example/templates/example
на сервере разработки в моем случае, так как я запускаю приложение example
из git clone git://github.com/pennersr/django-allauth.git
.
В этот каталог DIRS
я скопировал все подкаталоги account
и socialaccount
из предоставленных образцов шаблонов bootstrap
. Это совершенно противоречит структуре каталогов example
, поскольку она исходит от github
и отмечает в файле settings.py
example
.
И вы оставите urls.py
так же, как в приложении example
, просто:
url(r'^accounts/', include('allauth.urls')),
Ответ 4
В ваших представлениях:
from allauth.account.views import SignupView, LoginView
class MySignupView(SignupView):
template_name = 'my_signup.html'
class MyLoginView(LoginView):
template_name = 'my_login.html'
Ответ 5
Для меня работает только одно решение:
сначала сделайте TEMPLATE_LOADERS для загрузки файловой системы .Loader
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
# 'django.template.loaders.eggs.Loader',
)
second - создайте TEMPLATE_DIRS с контуром, где вы скопировали шаблоны из allauth. Убедитесь, что вы скопировали полную иерархию папок из папки шаблонов приложения allauth.
TEMPLATE_DIRS = (
os.path.join(BASE_DIR, 'cms', 'templates', 'allauth'),
)
в этом примере создан путь к моему приложению, называемый cms, потому что это основное приложение моего проекта
после того, как вы можете начать редактирование шаблона base.html
Ответ 6
Я нашел лучший способ сделать это, но забыл. Все Auth позволяет вам делать это очень просто, но при этом недостаточно документации. Вот мое следующее самое легкое решение, пока я не заново открою путь. #lol
Код создает пользовательскую страницу входа, но шаблон прост и легко реплицируется. Вы можете поместить весь этот код в urls.py
, или нет:
from allauth.account.views import LoginView
class Lvx(LoginView):
# Login View eXtended
# beware ordering and collisions on paths
template_name = "components/login.html"
# don't forget to create the login page, see All Auth docs
# for use. /components is in your app templates path
login = Lvx.as_view()
urlpatterns = [
url(r'^accounts/login/$', login), # usually up top
...
]
Существует также параметр, который вы можете использовать для указания на пользовательскую страницу, в какой-то момент отредактируйте это. Обратная связь приветствуется.