Как использовать встроенные представления сброса / изменения пароля с моими собственными шаблонами - PullRequest
91 голосов
/ 23 декабря 2008

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

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

Ответы [ 7 ]

99 голосов
/ 23 декабря 2008

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

В 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.

26 голосов
/ 14 февраля 2013

Настоятельно рекомендуем эту статью.

Я просто подключил его, и оно заработало

http://garmoncheg.blogspot.com.au/2012/07/django-resetting-passwords-with.html

10 голосов
/ 23 декабря 2008

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

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)

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

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

6 голосов
/ 24 апреля 2013

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

  1. добавить в свои urlpatterns (r '^ / accounts / password / reset / $', password_reset)
  2. поместите ваш шаблон в '/templates/registration/password_reset_form.html'
  3. заставьте ваше приложение иметь приоритет перед 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).

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

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

Другое, возможно, более простое решение - добавить каталог шаблонов переопределения в запись 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. Таким образом, шаблон сброса переопределенного пароля будет my_app/templates/registration/password_reset_form.html

1 голос
/ 04 марта 2013

Я использовал эти две строки в 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")
1 голос
/ 23 декабря 2008

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

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

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