В одном из веб-проектов, использующих Django 2.0.8, я забыл пароль своей учетной записи. Поэтому я решил сбросить его с помощью мастера «Забытый пароль». Получив письмо и открыв ссылку, я попал в форму, где мне нужно ввести новый пароль (поле password1) и подтвердить его еще раз (password2). Поскольку я допустил ошибку при написании двух неравных паролей (password1 = MyNewPass123), (password2 = MyNewPass12), приложение вылетело с ошибкой:
ValueError at /auth/password/reset/confirm/<CODE>/set-password/
Need 2 values to unpack in for loop; got 17.
<PATH>\lib\site-packages\django\template\defaulttags.py in render, line 202
Поэтому я вернулся и попробовал снова, на этот раз используя два одинаковые (действительные) пароли, которые были успешными. Я повторил шаг сброса пароля, используя новый пароль (снова два неравных ввода), и все же он разбился.
Поиск каких-либо ошибок или связанных с ними проблем не дал никаких результатов.
Главный вопрос здесь: Почему ForNode render в defaulttags.py получает так много элементов только из-за двух неравных значений .. Что может быть решением для этого?
ForNode in defaulttags.py:
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 Traceback:
Файл » \ lib \ site-packages \ django \ core \ handlers \ exception.py "во внутреннем 35. response = get_response (запрос)
Файл" \ lib \ site-packages \ django \ core \ handlers \ base. py "в _get_response 158. response = self.process_exception_by_middleware (e, request)
Файл" \ lib \ site-packages \ django \ core \ handlers \ base.py "в _get_response 156. response = response.render ()
Файл "\ lib \ site-packages \ django \ template \ response.py" в рендере 106. self.content = self.rendered_content
Файл "\ lib \ site-packages \ django \ template \ response.py "в rendered_content 83. content = template.render (context, self._request)
File" \ li b \ site-packages \ django \ template \ backends \ django .py "в Render 61. return self.template.render (context)
File" \ lib \ site-packages \ django \ template \ base.py "в рендере 175. return self._render (context)
File" \ lib \ site-packages \ django \ test \ utils.py "в Instrumented_test_render 98. return self.nodelist.render (context )
Файл "\ lib \ site-packages \ django \ template \ base.py" в рендере 943. bit = node.render_annotated (context)
Файл "\ lib \ site-packages \ django \ template \ base.py "в render_annotated 910. return self.render (context)
Файл" \ lib \ site-packages \ django \ template \ loader_tags.py "в render 155. return compiled_parent. _render (context)
Файл "\ lib \ site-packages \ django \ test \ utils.py" в Instrumented_test_render 98. return self.nodelist.render (context)
Файл "\ lib \ site-packages \ django \ template \ base.py "в рендере 943. bit = node.render_annotated (context)
Файл" \ lib \ site-packages \ django \ template \ base.py "в рендере der_annotated 910. return self.render (context)
Файл "\ lib \ site-packages \ django \ template \ loader_tags.py" в рендере 67. result = block.nodelist.render (context)
Файл "\ lib \ site-packages \ django \ template \ base.py" в рендере 943. bit = node.render_annotated (context)
Файл "\ lib \ site-packages \ django \ template \ base.py "в render_annotated 910. return self.render (context)
File" \ lib \ site-packages \ django \ template \ defaulttags.py "в render 314. return nodelist.render (context)
Файл "\ lib \ site-packages \ django \ template \ base.py" в рендере 943. bit = node.render_annotated (context)
Файл "\ lib \ site-packages \ django \ template \ base.py "в render_annotated 910. return self.render (context)
File" \ lib \ site-packages \ django \ template \ defaulttags.py "в render 314. return nodelist.render (контекст)
Файл "\ lib \ site-packages \ django \ template \ base.py" в рендере 943. bit = node.render_annotated (context)
Файл "\ lib \ site-packages \ django \ template \ base.py "в render_annotated 910. return self.render (context)
File" \ lib \ site-packages \ django \ template \ defaulttags.py "в render 202. .format (num_loopvars, len_item) ,
Тип исключения: ValueError в / auth / password / reset / confirm / MzAz / set-password / Exception Value: необходимо 2 значения для распаковки в цикле for; получил 17.