2016-05-27 17 views
0

私はdjangoでcontrib auth reset_passwordを使用しています。私が送信したリンクをクリックするとエラーが表示されます。ここで貢献認証リセットパスワードエラー

[27/May/2016 20:23:41] ERROR [django.request:256] Internal Server Error: /reset/MQ/4c9-5eacbebedfa0c1742a1c/ 
Traceback (most recent call last): 
    File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 164, in get_response 
    response = response.render() 
    File "/usr/local/lib/python2.7/dist-packages/django/template/response.py", line 158, in render 
    self.content = self.rendered_content 
    File "/usr/local/lib/python2.7/dist-packages/django/template/response.py", line 135, in rendered_content 
    content = template.render(context, self._request) 
    File "/usr/local/lib/python2.7/dist-packages/django/template/backends/django.py", line 74, in render 
    return self.template.render(context) 
    File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 209, in render 
    return self._render(context) 
    File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 201, in _render 
    return self.nodelist.render(context) 
    File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 903, in render 
    bit = self.render_node(node, context) 
    File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 917, in render_node 
    return node.render(context) 
    File "/usr/local/lib/python2.7/dist-packages/django/template/loader_tags.py", line 135, in render 
    return compiled_parent._render(context) 
    File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 201, in _render 
    return self.nodelist.render(context) 
    File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 903, in render 
    bit = self.render_node(node, context) 
    File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 917, in render_node 
    return node.render(context) 
    File "/usr/local/lib/python2.7/dist-packages/django/template/loader_tags.py", line 65, in render 
    result = block.nodelist.render(context) 
    File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 903, in render 
    bit = self.render_node(node, context) 
    File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 917, in render_node 
    return node.render(context) 
    File "/usr/local/lib/python2.7/dist-packages/django/template/defaulttags.py", line 507, in render 
    six.reraise(*exc_info) 
    File "/usr/local/lib/python2.7/dist-packages/django/template/defaulttags.py", line 493, in render 
    url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) 
    File "/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py", line 579, in reverse 
    return force_text(iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))) 
    File "/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py", line 496, in _reverse_with_prefix 
    (lookup_view_s, args, kwargs, len(patterns), patterns)) 
NoReverseMatch: Reverse for 'password-reset-confirm' with arguments '()' and keyword arguments '{u'uidb64': '', u'token': ''}' not found. 1 pattern(s) tried: ['reset/(?P<uidb64>[0-9A-Za-z_\\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$'] 

は私urls.pyです:

url(r'^password_reset/$', views.reset, name='password-reset'), 
url(r'^reset/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$', 
    views.reset_confirm, name='password-reset-confirm'), 

と私のviews.py:

def reset_confirm(request, uidb64=None, token=None): 
    return password_reset_confirm(request, template_name='registration/reset_confirm.html', 
     uidb64=uidb64, token=token, post_reset_redirect=reverse('dashboard-login')) 


def reset(request): 
    return password_reset(request, template_name='registration/reset.html', 
     email_template_name='registration/reset_email.html', 
     subject_template_name='registration/reset_subject.txt', 
     post_reset_redirect=reverse('dashboard-login')) 

と電子メールテンプレート:

Someone asked for password reset for email {{ email }}. Follow the link below: 
https://www.websitename.com{% url 'password-reset-confirm' uidb64=uid token=token %} 

はい、それは」にISN実際のテンプレートに「websitename.com」と入力します。そして私のリセットページテンプレート:

<div class="reset-page"> 
     <h3 class="reset-header">{% blocktrans %}Reset Password - Step 1 of 2{% endblocktrans %}</h3> 
     <form class="login-form" action="{% url 'password-reset' %}" method="post"> 
      <div class='form'>     
       {% csrf_token %}    
       <input id="id_email" name="email" type="text" class="text-login" placeholder="Email" /> 
       <input type="submit" class="submit-login" style="margin-top: 30px;" value="{% trans 'Submit' %}" /> 
      </div> 
     </form> 
     <p class="reset-info">{% blocktrans %}Enter your email address to receive a password change link.{% endblocktrans %}</p> 
</div> 

と表示されていないテンプレート、確認:

<div class="reset-page"> 
     <h3 class="reset-header">{% blocktrans %}Reset Password - Step 2 of 2{% endblocktrans %}</h3> 
     <form class="login-form" action="{% url 'password-reset-confirm' uidb64=uidb64 token=token %}" method="post"> 
      <div class='form'> 
       {% if validlink %} 
        {% csrf_token %} 
        <input id="id_new_password1" name="new_password1" type="text" class="text-login" placeholder="Password" /> 
        <input id="id_new_password2" name="new_password2" type="text" class="text-login" placeholder="Confirm Password" /> 
        <input type="submit" class="submit-login" value="{% trans 'Submit' %}" /> 
       {% else %} 
        <p class="reset-error">{% blocktrans %}Error: This reset link is no longer valid!{% endblocktrans %}</p> 
       {% endif %} 
       {% if error_messages %} 
        <p class="reset-error">Error: {{ error_messages }}</p> 
       {% endif %}      
      </div> 
     </form> 
     <p class="reset-info">{% blocktrans %}Enter your new password, twice.{% endblocktrans %}</p> 
</div> 

それは、電子メールのリンクまで動作します。/password_reset /にメールを入力するとメールが送信されますが、2つの新しいパスワードを入力するページに移動するのではなく、エラーが表示されます。エラーは、確認テンプレートのurlタグで発生しているようです。

EDIT:

ここ

エラーはどこから来るの一部であるdjango.contrib.auth.views.password_reset_confirm()である:私は確認テンプレートにそれはwasnことに気づい

@sensitive_post_parameters() 
@never_cache 
def password_reset_confirm(request, uidb64=None, token=None, 
          template_name='registration/password_reset_confirm.html', 
          token_generator=default_token_generator, 
          set_password_form=SetPasswordForm, 
          post_reset_redirect=None, 
          current_app=None, extra_context=None): 
    """ 
    View that checks the hash in a password reset link and presents a 
    form for entering a new password. 
    """ 
    UserModel = get_user_model() 
    assert uidb64 is not None and token is not None # checked by URLconf 
    if post_reset_redirect is None: 
     post_reset_redirect = reverse('password_reset_complete') 
    else: 
     post_reset_redirect = resolve_url(post_reset_redirect) 
    try: 
     # urlsafe_base64_decode() decodes to bytestring on Python 3 
     uid = force_text(urlsafe_base64_decode(uidb64)) 
     user = UserModel._default_manager.get(pk=uid) 
    except (TypeError, ValueError, OverflowError, UserModel.DoesNotExist): 
     user = None 

    if user is not None and token_generator.check_token(user, token): 
     validlink = True 
     title = _('Enter new password') 
     if request.method == 'POST': 
      form = set_password_form(user, request.POST) 
      if form.is_valid(): 
       form.save() 
       return HttpResponseRedirect(post_reset_redirect) 
     else: 
      form = set_password_form(user) 
    else: 
     validlink = False 
     form = None 
     title = _('Password reset unsuccessful') 
    context = { 
     'form': form, 
     'title': title, 
     'validlink': validlink, 
    } 
    if extra_context is not None: 
     context.update(extra_context) 

    if current_app is not None: 
     request.current_app = current_app 

    return TemplateResponse(request, template_name, context) 

は、引き数uidb64とトークンを取得する。だから私はそれらを追加しましたが、今では少し上のエラーが表示されています。議論は空であるようです。 uidb64とトークンの値を取得してURLに渡すことはできますか?

+0

メールテンプレートのレンダリング方法も表示してください。 – e4c5

+0

contrib.auth.views password_resetとpassword_reset_confirmとcontrib.auth.forms – shenk

+0

申し訳ありませんが、私はそれがレンダリングが行われた場所であることに気付きませんでした。結局のところ、そのコードは本当に必要なわけではないかもしれませんが、完全なスタックトレースは間違いなく有用でしょう。 – e4c5

答えて

0

ソリューションは、奇妙なことに

action="" 

に確認テンプレート内のフォームアクションを設定することでした。

関連する問題