Подтвердить что ты не робот

Как переопределить шаблон в django-allauth?

Ответы в других вопросах оставляют впечатление, что это на самом деле очень просто:

Однако я не могу заставить его работать вообще.

Из пример настроек приложения Я вижу, что django-allauth предположительно ожидает, что его шаблоны будут находиться в account, openid и socialaccount. Но когда я помещаю шаблон в TEMPLATE_DIR/account/signup.html, он не загружается, signup отображает шаблон, связанный с django-allauth. Что мне не хватает?

4b9b3361

Ответ 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
    ...
]

Существует также параметр, который вы можете использовать для указания на пользовательскую страницу, в какой-то момент отредактируйте это. Обратная связь приветствуется.