Форма Django очищается непреднамеренно

Я создал представление, которое отображает шаблон, и после отправки формы обновляет две модели.

На данный момент я проверяю только одну форму (is_valid()), но другая форма также очищается, хотя я не вызывал для них методы is_valid() или 'clean().

Мой вид:

def update_two_models_at_once(request):
    if request.method == "POST":
        form1 = Form1(request.POST)
        form2 = Form2(request.POST)
        if form1.is_valid():
            #form1.save()
            #post = form2.save(commit=False)
            #post.save()
            return HttpResponseRedirect(reverse('stock:forms'))
    else:
        form2 = Form2()
    return render(request, 'update_models.html', {'form2': form2})

У меня есть оператор печати в Form2, и он выполняется каждый раз, когда я отправляю форму, даже если я пытаюсь проверить только Form1.

Что-то я делаю неправильно или что-то не хватает? Отслеживание назад ссылается на эту строку здесь:

return render(request, 'update_models.html', {'form2': form2})

Кажется, когда я впервые визуализирую страницу, все в порядке. Но как только я отправляю страницу, Form1 не проходит проверку (я специально сделал ее не проверяемой), и когда он снова отображает шаблон, он вызывает чистый метод для Form2. Что с этим делать? Сейчас я хочу только проверить и очистить Form1.

Обновлено:

Мой код Form2:

class Form2(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    def clean(self):
        cleaned_data = super().clean()
        serial = cleaned_data.get('serial')

        print(error)

    class Meta:
        model = Form2Model
        fields = '__all__'

Проследите, как только будет достигнут print(error) при отправке моего шаблона:

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Python36\lib\site-packages\django\core\handlers\exception.py", line 35, in inner
    response = get_response(request)
  File "C:\Python36\lib\site-packages\django\core\handlers\base.py", line 128, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Python36\lib\site-packages\django\core\handlers\base.py", line 126, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "...\views.py", line 166, in update_two_models_at_once
    return render(request, 'update_models.html', {'form': form})
  File "C:\Python36\lib\site-packages\django\shortcuts.py", line 36, in render
    content = loader.render_to_string(template_name, context, request, using=using)
  File "C:\Python36\lib\site-packages\django\template\loader.py", line 62, in render_to_string
    return template.render(context, request)
  File "C:\Python36\lib\site-packages\django\template\backends\django.py", line 61, in render
    return self.template.render(context)
  File "C:\Python36\lib\site-packages\django\template\base.py", line 175, in render
    return self._render(context)
  File "C:\Python36\lib\site-packages\django\template\base.py", line 167, in _render
    return self.nodelist.render(context)
  File "C:\Python36\lib\site-packages\django\template\base.py", line 943, in render
    bit = node.render_annotated(context)
  File "C:\Python36\lib\site-packages\django\template\base.py", line 910, in render_annotated
    return self.render(context)
  File "C:\Python36\lib\site-packages\django\template\loader_tags.py", line 155, in render
    return compiled_parent._render(context)
  File "C:\Python36\lib\site-packages\django\template\base.py", line 167, in _render
    return self.nodelist.render(context)
  File "C:\Python36\lib\site-packages\django\template\base.py", line 943, in render
    bit = node.render_annotated(context)
  File "C:\Python36\lib\site-packages\django\template\base.py", line 910, in render_annotated
    return self.render(context)
  File "C:\Python36\lib\site-packages\django\template\loader_tags.py", line 67, in render
    result = block.nodelist.render(context)
  File "C:\Python36\lib\site-packages\django\template\base.py", line 943, in render
    bit = node.render_annotated(context)
  File "C:\Python36\lib\site-packages\django\template\base.py", line 910, in render_annotated
    return self.render(context)
  File "C:\Python36\lib\site-packages\django\template\defaulttags.py", line 307, in render
    match = condition.eval(context)
  File "C:\Python36\lib\site-packages\django\template\defaulttags.py", line 880, in eval
    return self.value.resolve(context, ignore_failures=True)
  File "C:\Python36\lib\site-packages\django\template\base.py", line 676, in resolve
    obj = self.var.resolve(context)
  File "C:\Python36\lib\site-packages\django\template\base.py", line 802, in resolve
    value = self._resolve_lookup(context)
  File "C:\Python36\lib\site-packages\django\template\base.py", line 843, in _resolve_lookup
    current = getattr(current, bit)
  File "C:\Python36\lib\site-packages\django\forms\forms.py", line 174, in errors
    self.full_clean()
  File "C:\Python36\lib\site-packages\django\forms\forms.py", line 377, in full_clean
    self._clean_form()
  File "C:\Python36\lib\site-packages\django\forms\forms.py", line 404, in _clean_form
    cleaned_data = self.clean()
  File "...\forms.py", line 80, in clean
    print(error)
NameError: name 'error' is not defined

Где именно находится оператор печати? А какая обратная связь?

Daniel Roseman 22.04.2018 10:09

@DanielRoseman В моем методе очистки Form2. Когда я намеренно выдаю ошибку, я вижу, откуда был вызван чистый метод. Что происходит при рендеринге моего шаблона после неудачной проверки Form1.

juiceb0xk 22.04.2018 10:34

Не могли бы вы показать трассировку, а также код Form2?

Daniel Roseman 22.04.2018 10:35

@DanielRoseman Я обновил свой вопрос. Дай мне знать, если тебе что-нибудь понадобится, спасибо.

juiceb0xk 22.04.2018 11:00

Поскольку ошибка возникает при рендеринге формы, я думаю, что этот вопрос, stackoverflow.com/questions/17471844/…, является дубликатом. В случае подтверждения он может быть закрыт как таковой.

user707650 22.04.2018 11:08

@Evert Я рассмотрел этот вопрос, но не знаю, как бы реализовать это в моем собственном коде. Какие-либо предложения? Я сам реализовал исходные параметры, но ничего не делает.

juiceb0xk 22.04.2018 12:07
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
6
41
0

Другие вопросы по теме