96

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

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

4

7 に答える 7

102

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番目のメンバーとして辞書を含めることにより、ビューにキーワード引数を指定できます。

于 2008-12-23T13:21:11.403 に答える
27

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

プラグインしただけで動作しました

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

于 2013-02-14T05:52:07.483 に答える
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

于 2008-12-23T18:27:06.573 に答える
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が欲しい
于 2013-04-24T13:20:44.197 に答える
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

于 2016-11-26T22:35:09.407 に答える
1

ドキュメントには、コンテキスト変数は1つしかないと記載されていますform

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

  • form:ログインフォームを表すFormオブジェクト。フォームオブジェクトの詳細については、フォームのドキュメントを参照してください。
  • next:ログインに成功した後にリダイレクトするURL。これにはクエリ文字列も含まれる場合があります。
  • site_name:SITE_ID設定に従った現在のサイトの名前。
于 2008-12-23T12:54:28.010 に答える
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")
于 2013-03-04T14:11:37.483 に答える