Django 2.0.8在重置密码不相等时崩溃



在一个使用Django 2.0.8的web项目中,我忘记了帐户的密码。所以我决定使用"忘记密码"向导重置它。收到邮件并打开链接后,我进入了需要插入新密码(字段密码1(并再次确认(密码2(的表单。由于我在写两个不相等的密码(password1=MyNewPass123(和(password2=MyNewPass12(时出错,应用程序崩溃,出现错误:

ValueError at /auth/password/reset/confirm/<CODE>/set-password/
Need 2 values to unpack in for loop; got 17. 
<PATH>libsite-packagesdjangotemplatedefaulttags.py in render, line 202

所以我回去再试了一次,这次使用了两个相等(有效(的密码,都成功了。我重复了密码重置步骤,使用了一个新密码(同样是两个不相等的输入(,但它崩溃了。

搜索任何错误或相关问题都没有返回任何结果。

这里的主要问题是什么:为什么ForNode在defaulttags.py中渲染会收到这么多项,仅仅是因为两个不相等的值。。解决这个问题的办法是什么?

defaulttags.py:中的ForNode

class ForNode(Node):
child_nodelists = ('nodelist_loop', 'nodelist_empty')
def __init__(self, loopvars, sequence, is_reversed, nodelist_loop, nodelist_empty=None):
self.loopvars, self.sequence = loopvars, sequence
self.is_reversed = is_reversed
self.nodelist_loop = nodelist_loop
if nodelist_empty is None:
self.nodelist_empty = NodeList()
else:
self.nodelist_empty = nodelist_empty
def __repr__(self):
reversed_text = ' reversed' if self.is_reversed else ''
return "<For Node: for %s in %s, tail_len: %d%s>" % 
(', '.join(self.loopvars), self.sequence, len(self.nodelist_loop),
reversed_text)
def __iter__(self):
yield from self.nodelist_loop
yield from self.nodelist_empty
def render(self, context):
if 'forloop' in context:
parentloop = context['forloop']
else:
parentloop = {}
with context.push():
try:
values = self.sequence.resolve(context, True)
except VariableDoesNotExist:
values = []
if values is None:
values = []
if not hasattr(values, '__len__'):
values = list(values)
len_values = len(values)
if len_values < 1:
return self.nodelist_empty.render(context)
nodelist = []
if self.is_reversed:
values = reversed(values)
num_loopvars = len(self.loopvars)
unpack = num_loopvars > 1
# Create a forloop value in the context.  We'll update counters on each
# iteration just below.
loop_dict = context['forloop'] = {'parentloop': parentloop}
for i, item in enumerate(values):
# Shortcuts for current loop iteration number.
loop_dict['counter0'] = i
loop_dict['counter'] = i + 1
# Reverse counter iteration numbers.
loop_dict['revcounter'] = len_values - i
loop_dict['revcounter0'] = len_values - i - 1
# Boolean values designating first and last times through loop.
loop_dict['first'] = (i == 0)
loop_dict['last'] = (i == len_values - 1)
pop_context = False
if unpack:
# If there are multiple loop variables, unpack the item into
# them.
try:
len_item = len(item)
except TypeError:  # not an iterable
len_item = 1
# Check loop variable count before unpacking
if num_loopvars != len_item:
raise ValueError(
"Need {} values to unpack in for loop; got {}. "
.format(num_loopvars, len_item),
)
unpacked_vars = dict(zip(self.loopvars, item))
pop_context = True
context.update(unpacked_vars)
else:
context[self.loopvars[0]] = item
for node in self.nodelist_loop:
nodelist.append(node.render_annotated(context))
if pop_context:
# Pop the loop variables pushed on to the context to avoid
# the context ending up in an inconsistent state when other
# tags (e.g., include and with) push data to context.
context.pop()
return mark_safe(''.join(nodelist))

password_reset_confirm.html

{% extends "base.html" %}
{% load crispy_forms_tags %}
{% block breadcrumb %}
{{ block.super }}
</h1>Password reset</h1>
{% endblock %}
{% block content %}
{% if validlink %}
<form method="post">
{% if form.errors %}
<div class="alert alert-danger">
{% for key,value in form.error_messages %}
{{ value }}<br />
{% endfor %}
{{ form.error_messages }}
{% endif %}
</div>
{% csrf_token %}
{{ form|crispy }}
<button type="submit">Submit</button>
</form>
{% else %}
<p>Wrong activation code</p>
{% endif %}
{% endblock %}

TRACEBACK回溯:

内部文件"\lib\site packages\django\core\handlers\exception.py"35.response=get_response(request(

_get_response中的文件"\lib\site packages\django\core\handlers\base.py"158.response=self.process_exception_by_middleware(e,request(

_get_response中的文件"\lib\site packages\django\core\handlers\base.py"156.response=response.render((

渲染中的文件"\lib\site packages\django\template\response.py"106.self.content=self.rendered_content

rendered_content中的文件"\lib\site packages\django\template\response.py"83.content=template.render(context,self.request(

渲染中的文件"\lib\site packages\django\template\backends\django.py"61.返回self.template.render(上下文(

渲染中的文件"\lib\site packages\django\template\base.py"175.回归自我_呈现(上下文(

instrumented_test_render中的文件"\lib\site packages\django\test\utils.py"98.return self.nodelist.render(上下文(

渲染中的文件"\lib\site packages\django\template\base.py"943.bit=node.render_anotated(上下文(

render_annoted中的文件"\lib\site packages\django\template\base.py"910.返回self.render(上下文(

渲染中的文件"\lib\site packages\django\template\loader_tags.py"155.返回compiled_parent_呈现(上下文(

instrumented_test_render中的文件"\lib\site packages\django\test\utils.py"98.return self.nodelist.render(上下文(

渲染中的文件"\lib\site packages\django\template\base.py"943.bit=node.render_anotated(上下文(

render_annoted中的文件"\lib\site packages\django\template\base.py"910.返回self.render(上下文(

渲染中的文件"\lib\site packages\django\template\loader_tags.py"67.result=block.nodelist.render(上下文(

渲染中的文件"\lib\site packages\django\template\base.py"943.bit=node.render_anotated(上下文(

render_annoted中的文件"\lib\site packages\django\template\base.py"910.返回self.render(上下文(

渲染中的文件"\lib\site packages\django\template\defaulttags.py"314.return nodelist.render(上下文(

渲染中的文件"\lib\site packages\django\template\base.py"943.bit=node.render_anotated(上下文(

render_annoted中的文件"\lib\site packages\django\template\base.py"910.返回self.render(上下文(

渲染中的文件"\lib\site packages\django\template\defaulttags.py"314.return nodelist.render(上下文(

渲染中的文件"\lib\site packages\django\template\base.py"943.bit=node.render_anotated(上下文(

render_annoted中的文件"\lib\site packages\django\template\base.py"910.返回self.render(上下文(

渲染中的文件"\lib\site packages\django\template\defaulttags.py"202..格式(num_loopvars,len_item(,

异常类型:/auth/password/reset/confirm/MzAz/set password处的ValueError/异常值:需要2个值来解压缩循环;得了17分。

经过一步一步的努力,我终于找到了问题和解决方案。

问题出现在我的密码_reset_confirm.html

错误所在的代码:

{% if form.errors %}
<div class="alert alert-danger">
# here it receives 17 values to unpack, but needs actually two (key, value)
{% for key,value in form.**error_messages** %}
{{ value }}<br />
{% endfor %}
{% endif %}

解决方案。。

将"items"放在表单.error_messages的末尾后,我收到了一个没有错误的有效输出。工作代码:

{% if form.errors %}
<div class="alert alert-danger">
{% for key, value in form.error_messages.items %}
{{ value }}
{% endfor %}
{% endif %}

最新更新