Как использовать встроенный пароль reset/изменить виды с помощью собственных шаблонов

Например, я могу указать url '^/accounts/password/reset/$' на django.contrib.auth.views.password_reset с моим именем файла шаблона в контексте, но мне кажется, вам нужно отправить больше деталей контекста.

Мне нужно точно знать, какой контекст добавить для каждого из паролей reset и изменить виды.

Ответ 1

Если вы посмотрите на источники django.contrib.auth.views.password_reset, вы увидите, что он использует RequestContext. В результате вы можете использовать Context Processors для изменения контекста, который может позволить вам вводить необходимую вам информацию.

В b-списке есть хорошее представление для контекстных процессоров.

Изменить (я, кажется, был смущен тем, что было на самом деле):

Вы заметите, что password_reset принимает именованный параметр с именем template_name:

def password_reset(request, is_admin_site=False, 
            template_name='registration/password_reset_form.html',
            email_template_name='registration/password_reset_email.html',
            password_reset_form=PasswordResetForm, 
            token_generator=default_token_generator,
            post_reset_redirect=None):

Подробнее о password_reset.

... таким образом, с urls.py вроде:

from django.conf.urls.defaults import *
from django.contrib.auth.views import password_reset

urlpatterns = patterns('',
     (r'^/accounts/password/reset/$', password_reset, {'template_name': 'my_templates/password_reset.html'}),
     ...
)

django.contrib.auth.views.password_reset будет вызываться для URL-адресов, соответствующих '/accounts/password/reset', с аргументом ключевого слова template_name = 'my_templates/password_reset.html'.

В противном случае вам не нужно предоставлять какой-либо контекст, поскольку представление password_reset заботится о себе. Если вы хотите узнать, какой контекст у вас есть, вы можете вызвать ошибку TemplateSyntax и просмотреть трассировку стека, чтобы найти кадр с локальной переменной с именем context. Если вы хотите изменить контекст, то то, что я сказал выше о обработчиках контекстов, возможно, это путь.

Вкратце: что вам нужно сделать, чтобы использовать свой собственный шаблон? Предоставьте аргумент ключевого слова template_name для представления при его вызове. Вы можете поставить аргументы ключевого слова в представления, включив словарь в качестве третьего члена кортежа шаблонов URL.

Ответ 3

Вам просто нужно обернуть существующие функции и передать в нужном вам шаблоне. Например:

from django.contrib.auth.views import password_reset

def my_password_reset(request, template_name='path/to/my/template'):
    return password_reset(request, template_name)

Чтобы увидеть это, просто взгляните на функцию declartion встроенных представлений:

http://code.djangoproject.com/browser/django/trunk/django/contrib/auth/views.py#L74

Ответ 4

Вы можете сделать следующее:

  • добавить к своим URL-адресам (r '^/accounts/password/ reset/$', password_reset)
  • поместите свой шаблон в '/templates/registration/password_reset_form.html'
  • сделайте свое приложение перед "django.contrib.auth" в INSTALLED_APPS

Пояснение:

Когда шаблоны загружаются, они выполняются в вашей переменной INSTALLED_APPS в settings.py. Порядок продиктован рангом определения в INSTALLED_APPS, так как ваше приложение появилось до "django.contrib.auth", ваш шаблон был загружен (ссылка: https://docs.djangoproject.com/en/dev/ref/templates/api/#django.template.loaders.app_directories.Loader).

Мотивация подхода:

  • Я хочу быть более сухим и не повторяться для любого представления (определенного django) имени шаблона (они уже определены в django)
  • Мне нужен самый маленький url.py

Ответ 5

документация говорит, что существует только одна контекстная переменная form.

Если у вас возникли проблемы с логином (что является общим), документация говорит, что существуют три контекстные переменные:

  • form: объект формы, представляющий форму входа. Подробнее о формах см. В документации по формам.
  • next: URL-адрес для перенаправления после успешного входа в систему. Это может также содержать строку запроса.
  • site_name: имя текущего сайта, в соответствии с настройкой SITE_ID.

Ответ 6

Я использовал эти две строки в URL-адресе и шаблоне администратора, что я менял в своей потребности

url(r'^change-password/$', 'django.contrib.auth.views.password_change', {
    'template_name': 'password_change_form.html'}, name="password-change"),
url(r'^change-password-done/$', 'django.contrib.auth.views.password_change_done', {
    'template_name': 'password_change_done.html'
    }, name="password-change-done")

Ответ 7

Другим, возможно, более простым решением является добавление вашего каталога шаблонов переопределения в запись DIRS параметра TEMPLATES в settings.py. (Я думаю, что этот параметр является новым в Django 1.8. Его можно было назвать TEMPLATE_DIRS в предыдущих версиях Django.)

Так же:

TEMPLATES = [
   {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        # allow overriding templates from other installed apps                                                                                                
        'DIRS': ['my_app/templates'],
        'APP_DIRS': True,
}]

Затем поместите свои файлы шаблонов переопределения в my_app/templates. Таким образом, шаблон переопределенного пароля reset будет my_app/templates/registration/password_reset_form.html