2011-04-17 27 views
0

我正在使用內置的auth_views.password_reset(_confirm, _done, _complete)功能,並且我想限制對這些視圖的訪問只限於未登錄(匿名)的用戶,因爲它沒有任何意義讓登錄用戶重置密碼。django anonymous_required自定義裝飾器與密碼重設視圖衝突

我發現這個鏈接@login_required相反:http://passingcuriosity.com/2009/writing-view-decorators-for-django/

的裝飾工程auth_views.password_reset。我在我的網站中使用它

url(r'^password/reset/$', 
         anonymous_required(auth_views.password_reset), 
         name='auth_password_reset'), 

由於某種原因,它不適用於其他3個視圖。例如以下網址:

url(r'^password/reset/done/$', 
         anonymous_required(auth_views.password_reset_done), 
         name='auth_password_reset_done'), 

給了我以下錯誤:

Exception Value:
Reverse for 'django.contrib.auth.views.password_reset_done' with arguments '()' and keyword arguments '{}' not found.

誰能告訴我爲什麼?

給出的裝飾代碼是:

def anonymous_required(function=None, home_url=None, redirect_field_name=None): 
"""Check that the user is NOT logged in. 

This decorator ensures that the view functions it is called on can be 
accessed only by anonymous users. When an authenticated user accesses 
such a protected view, they are redirected to the address specified in 
the field named in `next_field` or, lacking such a value, the URL in 
`home_url`, or the `USER_HOME_URL` setting. 
""" 
if home_url is None: 
    home_url = settings.USER_HOME_URL 

def _dec(view_func): 
    def _view(request, *args, **kwargs): 
     if request.user.is_authenticated(): 
      url = None 
      if redirect_field_name and redirect_field_name in request.REQUEST: 
       url = request.REQUEST[redirect_field_name] 
      if not url: 
       url = home_url 
      if not url: 
       url = "/" 
      return HttpResponseRedirect(url) 
     else: 
      return view_func(request, *args, **kwargs) 

    _view.__name__ = view_func.__name__ 
    _view.__dict__ = view_func.__dict__ 
    _view.__doc__ = view_func.__doc__ 

    return _view 

if function is None: 
    return _dec 
else: 
    return _dec(function) 

回答

0

我看到password_reset包括在錯誤消息中提到的常規的反向。它是否試圖做到這一點,但你已經覆蓋它,或不包括它在urls.conf?

django的/了contrib/AUTH/views.py:141-142(V1.3)

if post_reset_redirect is None: 
    post_reset_redirect = reverse('django.contrib.auth.views.password_reset_done')