web-dev-qa-db-ja.com

自分のテンプレートで組み込みのパスワードリセット/変更ビューを使用する方法

たとえば、url '^/accounts/password/reset/$'からDjango.contrib.auth.views.password_resetコンテキスト内のテンプレートファイル名を使用しますが、コンテキストの詳細を送信する必要があると思います。

パスワードのリセットと変更の各ビューに追加するコンテキストを正確に知る必要があります。

91
Tom Viner

Django.contrib.auth.views.password_reset のソースを見ると、 RequestContext を使用していることがわかります。要するに、コンテキストプロセッサを使用してコンテキストを変更し、必要な情報を注入できる場合があります。

B-listには、優れた コンテキストプロセッサの紹介 があります。

編集(実際の質問が何であるかについて混乱しているようです):

password_resettemplate_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は、キーワード引数'/accounts/password/reset'と一致するtemplate_name = 'my_templates/password_reset.html'に一致するURLに対して呼び出されます。

それ以外の場合は、password_resetビューがそれ自体を処理するため、コンテキストを提供する必要はありません。使用可能なコンテキストを確認する場合は、TemplateSyntaxエラーをトリガーし、スタックトレースを調べて、contextという名前のローカル変数を持つフレームを見つけます。コンテキストを変更する場合は、コンテキストプロセッサについて上記で説明したことがおそらく実行方法です。

要約すると、独自のテンプレートを使用するには何をする必要がありますか?ビューが呼び出されたときに、ビューにtemplate_nameキーワード引数を提供します。 URLパターンTupleの3番目のメンバーとして辞書を含めることにより、ビューにキーワード引数を提供できます。

99
Aaron Maenpaa

この記事を強くお勧めします。

差し込んだだけで機能した

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

26
Alex Stewart

既存の関数をラップして、必要なテンプレートを渡すだけです。例えば:

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

10
jb.

次のことができます。

  1. urlpatternsに追加します(r '^/accounts/password/reset/$'、password_reset)
  2. テンプレートを「/templates/registration/password_reset_form.html」に配置します
  3. iNSTALLED_APPSの「Django.contrib.auth」の前にアプリを配置します

説明:

テンプレートがロードされると、settings.pyのINSTALLED_APPS変数でテンプレートが検索されます。順序は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が欲しい
6
Lodato L

別の、おそらくより簡単な解決策は、設定テンプレートディレクトリをsettings.pyのTEMPLATES設定のDIRSエントリに追加することです。 (この設定はDjango 1.8で新しくなったと思います。以前のDjangoバージョンではTEMPLATE_DIRSと呼ばれていました。)

そのようです:

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
nmgeek

私は私の2つの行を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
Azd325

ドキュメント は、コンテキスト変数formが1つだけであることを示しています。

ログインに問題がある場合(これは一般的です)、 documentation は3つのコンテキスト変数があると言います:

  • form:ログインフォームを表すFormオブジェクト。 Formオブジェクトの詳細については、フォームのドキュメントを参照してください。
  • next:ログイン成功後にリダイレクトするURL。これにはクエリ文字列も含まれる場合があります。
  • site_name:SITE_ID設定に従った現在のサイトの名前。
1
S.Lott