django 易碎表单引发VariableDoesNotExist错误,查找表单上的键[html5_required]失败

lqfhib0f  于 2023-01-06  发布在  Go
关注(0)|答案(4)|浏览(133)

我使用allauth通过电子邮件登录,做了一个非常基本的自定义登录表单,并为allauth重写了一个模板,然后显示登录表单。
在[{'True ':正确,"错误":错误,"无":无},{"真":正确,"错误":错误,"无":无,"表格":,"表单显示错误":True,"表单显示标签":真,"标签类":""、"字段类":""},{" for循环":{"父循环":{},"计数器0":1、"反":2、"转速表":2,"转速计数器0":1、"第一":假,"最后":False},"字段":}、{}]
在那里我必须继续调试两次才能在窗体上结束。
我试着寻找这个特定的[html5_required]标记/密钥,但没有找到任何具有相同丢失密钥的人。
我删除了settings.py中的自定义登录表单,以查看是否存在问题,但没有帮助。
我甚至用一个只显示两个字段的简单"ModelForm"测试过,也得到了同样的问题。
我两个都试过了:基于类的视图(用于登录)和基于函数的视图(用于配置文件),我在这两个视图上都遇到了同样的问题。
settings.py:

INSTALLED_APPS = [
   ...
   'crispy_forms',
   'allauth',
   'allauth.account',
   'allauth.socialaccount',
   'allauth.socialaccount.providers.google',
   ...
]

CRISPY_TEMPLATE_PACK = 'bootstrap4'

ACCOUNT_FORMS = {
   "login": "users.forms.CustomLoginForm"
}

forms.py

from django.utils.translation import ugettext as _
from django.urls import reverse_lazy
from allauth.account.forms import LoginForm, SignupForm
from crispy_forms.helper import FormHelper
from crispy_forms.layout import HTML
from django.forms import ModelForm

class CustomLoginForm(LoginForm):
    def __init__(self, *args, **kwargs):
        super(CustomLoginForm, self).__init__(*args, **kwargs)
        self.helper = FormHelper(self)
        # Add magic stuff to redirect back.
        self.helper.layout.append(
            HTML(
                "{% if redirect_field_value %}"
                "<input type='hidden' name='{{ redirect_field_name }}'"
                " value='{{ redirect_field_value }}' />"
                "{% endif %}"
            )
        )
        # Add password reset link.
        self.helper.layout.append(
            HTML(
                "<p><a class='button secondaryAction' href={url}>{text}</a></p>".format(
                    url=reverse_lazy('account_reset_password'),
                    text=_('Forgot Password?')
                )
            )
        )
        # Add submit button like in original form.
        self.helper.layout.append(
            HTML(
                '<button class="btn btn-primary btn-block" type="submit">'
                '%s</button>' % _('Sign In')
            )
        )

        self.helper.form_class = 'form-horizontal'
        self.helper.label_class = 'col-xs-2 hide'
        self.helper.field_class = 'col-xs-8'

templates/account/login.html

{% extends 'base.html' %}
{% load crispy_forms_tags %}

{% block content %}
  <h2>Login</h2>
  <form method="post">
    {% csrf_token %}
    {{ form|crispy }}
    <button class="btn btn-primary" type="submit">Login</button>
  </form>
{% endblock %}

下面的代码是概要文件的基于快速函数的视图,它使用了几乎相同的模板:
一个三个三个一个
我不明白为什么这个键不见了,是不是我忘了什么东西或者遗漏了某个配置部分?
我正在使用的版本:

  • Django :2.2.4
  • 平均值:0.39.1
  • 松脆型:1.7.2
  • Python:3.7.4

任何指导都非常感谢。

    • EDIT:**我创建了一个完整的新项目作为测试,它只有简单的表单,一个只有2个字符字段的模型,上面提到的ModelForm和模板,并收到了相同的问题。

所以要么是我做错了什么/遗漏了什么,要么是有问题,我也提出了他们的github问题https://github.com/django-crispy-forms/django-crispy-forms/issues/891

csbfibhn

csbfibhn1#

我将此作为“部分”答案,因为我不知道为什么或(行为上的)差异是什么,但将模板中对表单的调用从:

{{ form|crispy }}

{% crispy form %}

去掉了异常。
然后,正如@skilled-in-blockchain提到的,我可以将FormHelper添加到表单中,以进行其他修改。

68bkxrlz

68bkxrlz2#

请允许我总结一下Github上的问题。很明显,这是VS代码的问题,正如在这个回复中指出的。
1.这个问题可以通过在launch.json文件中设置"django": false来解决,但是这将不再允许您调试模板的渲染。换句话说,在模板中设置断点将不再导致调试器执行在这些点暂停。有关在VS代码中调试Django的更多信息,请参见this tutorial
1.正如在另一篇文章中提到的,从:

{{ form|crispy }}

到这个

{% crispy form %}

也解决了这个问题。但是,这也需要你使用FormHelper来插入按钮,或者id等等。查看crispy form's documentation on the fundamentels如何使用它。

mkshixfv

mkshixfv3#

我也有同样的问题。
在基于功能的视图上(对于配置文件)

#forms.py:
class UserProfileForm(ModelForm):

    class Meta:
        model = UserProfile
        fields = ('gender', 'birthdate')

将以下导入添加到顶部

from crispy_forms.helper import FormHelper

然后在类定义之后立即创建helper

#forms.py:
class UserProfileForm(ModelForm):
    helper = FormHelper()

    class Meta:
        model = UserProfile
        fields = ('gender', 'birthdate')

我做了上面的,它为我解决了这个问题。

3pmvbmvn

3pmvbmvn4#

我遇到了同样的问题(Failed lookup for key [form] in [{'True': True, 'False': False, 'None': None}, {}, {}]),并注意到我从Create类中复制了下面的代码,但从未返回上下文。

def get_context_data(self, **kwargs):
    context = super(MyUpdateView, self).get_context_data(**kwargs)

我一删除get_context_data或添加return context,这个问题就消失了。

相关问题