21

登録アプリでDjango-nonrelを使用しています。パスワードをリセットしようとした場合を除いて、問題なく動作しているようです。電子メールで送信されたパスワードのリセットリンクをクリックすると、Djangoはエラーメッセージを生成します。

password_reset_confirm() got an unexpected keyword argument 'uidb36'

私の質問:誰かがそれを見て、治療法が何であるか知っていますか?

編集:

この問題は、registration\auth_urls.pyが原因で発生します。django\contrib\ auth \ urls.pyのエントリが重複しており、Django-nonrelのパッチが適用されたバージョンのファイルを迂回しています。

なぜそこにあるのか、実際に削除したり修正したりできますか?

4

4 に答える 4

34

Django 1.6は、ベース36エンコーディングではなく、ベース64エンコーディングをユーザーのIDに使用します。

カスタムパスワードリセットURLがある場合は、uidb36をuidb64に置き換え、そのパターンに続くダッシュをスラッシュに置き換えて、URLを更新する必要があります。また、uidb64パターンに一致する可能性のある文字のリストに「_」、「\」、および「-」を追加します。

たとえば、Django 1.5のurls.pyのこの行-:

url(r'^reset/(?P<uidb36>[0-9A-Za-z]+)-(?P<token>.+)/$',
    'django.contrib.auth.views.password_reset_confirm',
    name='password_reset_confirm'),

Django 1.6以降では、これに変更する必要があります。

url(r'^reset/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>.+)/$',
    'django.contrib.auth.views.password_reset_confirm',
    name='password_reset_confirm'),

変更の詳細を示す公式の変更ログは次のとおりです: https ://docs.djangoproject.com/en/1.6/releases/1.6/#django-contrib-auth-password-reset-uses-base-64-encoding-of-user -pk

于 2013-12-03T21:51:56.873 に答える
9

私の解決策は、registration \ auth_urls.pyで定義されたurlpatternsをコメントアウトし、django.contrib.authで定義されたurlpatternsのコピーとして再定義することでした。

変更後のauth_urls.pyは次のとおりです。

"""
URL patterns for the views included in ``django.contrib.auth``.

Including these URLs (via the ``include()`` directive) will set up the
following patterns based at whatever URL prefix they are included
under:

* User login at ``login/``.

* User logout at ``logout/``.

* The two-step password change at ``password/change/`` and
  ``password/change/done/``.

* The four-step password reset at ``password/reset/``,
  ``password/reset/confirm/``, ``password/reset/complete/`` and
  ``password/reset/done/``.

The default registration backend already has an ``include()`` for
these URLs, so under the default setup it is not necessary to manually
include these views. Other backends may or may not include them;
consult a specific backend's documentation for details.

"""

from django.conf.urls.defaults import *

#from django.contrib.auth import views as auth_views

from django.contrib.auth import urls as auth_urls

urlpatterns = auth_urls.urlpatterns

'''
Commented out, this is what caused my problems:

urlpatterns = patterns('',
                       url(r'^login/$',
                           auth_views.login,
                           {'template_name': 'registration/login.html'},
                           name='auth_login'),
                       url(r'^logout/$',
                           auth_views.logout,
                           {'template_name': 'registration/logout.html'},
                           name='auth_logout'),
                       url(r'^password/change/$',
                           auth_views.password_change,
                           name='auth_password_change'),
                       url(r'^password/change/done/$',
                           auth_views.password_change_done,
                           name='auth_password_change_done'),
                       url(r'^password/reset/$',
                           auth_views.password_reset,
                           name='auth_password_reset'),
                       url(r'^password/reset/confirm/(?P<uidb36>[0-9A-Za-z]+)-(?P<token>.+)/$',
                           auth_views.password_reset_confirm,
                           name='auth_password_reset_confirm'),
                       url(r'^password/reset/complete/$',
                           auth_views.password_reset_complete,
                           name='auth_password_reset_complete'),
                       url(r'^password/reset/done/$',
                           auth_views.password_reset_done,
                           name='auth_password_reset_done'),
) 
'''
于 2011-06-13T00:22:45.387 に答える
5

次のように、uidb36引数をに変更する必要がありました。uidb64

から:

url(r'^password/reset/confirm/(?P<uidb36>[0-9A-Za-z]+)-(?P<token>.+)/$',

に:

url(r'^password/reset/confirm/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/$',

その後、パスワードのリセットが再び機能し始めました。

于 2011-12-21T20:18:28.170 に答える
1

urls.pyのpassword_reset_confirmurlは次のようになります。

url(r'^ accounts / password_reset /(?P [0-9A-Za-z] {1,13})-(?P [0-9A-Za-z] {1,13}-[0-9A -Za-z] {1,20})/ $'、password_reset_confirm、{' post_reset_redirect':' / accounts / password_reset / complete /'}、name = "password_reset_confirm")、

password_reset_email.htmlのリンクは{{protocol}}:// {{domain}} {%url'password_reset_confirm' uidb36 = uid token = token%}のようになります。

両方の場所でuib36をuib64に変更するだけで、機能します。

于 2017-02-16T06:11:39.313 に答える