Django 2.0.8 вылетает при сбросе паролей неравные - PullRequest
0 голосов
/ 08 мая 2020

В одном из веб-проектов, использующих 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.

1 Ответ

0 голосов
/ 08 мая 2020

Пройдя шаг за шагом, мне удалось найти проблему и решение.

Проблема была в моем password_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 %}

Решение ..

После помещения «элементов» в конец form.error_messages я получил действительный вывод без ошибок . Рабочий код:

{% if form.errors %}
 <div class="alert alert-danger">
 {% for key, value in form.error_messages.items %}
     {{ value }}
 {% endfor %}
{% endif %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...