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


92

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

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


1
この質問のタイトルを考えるcontextと、あなたが探しているのは正しいとは思えません!
jb。

2
確認のために、「コンテキスト」とは、URL行の3番目の引数である追加データの辞書を意味しました。別名追加データまたはクワーグ。混乱してすみません、誰でも編集できる質問を編集してください。
Tom Viner、2011

回答:


100

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

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

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

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

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

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


問題は組み込みのビューで異なるテンプレートを使用することに関するものだと思います-コンテキストプロセッサはそれに考慮されません!
jb。

6
すべてのアイデアは、どのようにするregistration/password_reset_email.html:のようなHTML要素が含まれている実際に<div><a>これはテキストのみ送信するため
mabdrabo

@mabdrabo- HTMLを機能させる方法に関するこの記事を確認してください
gregoltsov

26

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

差し込んだだけでうまくいった

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


2
素晴らしいリンク、ありがとう。リンクをたどる人のために-django-registrationにデフォルトの認証ビューが含まれるようになりました...したがって、上記のリンクで詳述されているテンプレートを作成するだけです。また、彼が行ったすべての手動の​​HTMLフォーム作業も回避したい場合は、django-crispy-formsを使用します。
dougvk 2013

職場で管理しなければならないレガシーDjangoコードがいくつかありますが、フレームワークについてはほとんど知りません。その男は私のお尻を救った!素晴らしいチュートリアル
Matt Vukas 14

リンクをありがとう!あなたが言ったように、プラグインしてそれが機能したので、これは受け入れられる答えになるはずだと思います。
ihatecache 2015年

10

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

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


2
それを行う最も簡単な方法ではありません。URLパターンタプルの3番目の部分としてディクショナリを渡すことができます。または、本当に関数をラップする必要があると思われる場合は、次のように使用できます。password_reset = functools.partial(password、template_name = "path / to / my / template" )
Aaron Maenpaa 2008

7

次のことができます。

  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が欲しい

2

別の、おそらくより簡単な解決策は、オーバーライドテンプレートディレクトリを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

ドキュメントは、そこに一つだけのコンテキスト変数と述べていますform

ログインに問題がある場合(これは一般的です)、ドキュメントには3つのコンテキスト変数があると記載されています。

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

2
ドキュメントには、「template_name」と呼ばれる「オプションの引数」があり、より関連性があるようです。
jb。

オプションの引数は、フォームへのコンテキストではなく、関数への引数です。
S.Lott、2008

うーん、問題の解決に関連するすべてのことがpassword_resetビューの引数であるときに「コンテキスト」について話しているので、質問は混乱していると思います。
jb。

1

私はURLのこの2行と管理者からのテンプレートを使用していて、必要に応じて変更していました

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")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.