【问题标题】:Crispy forms throws VariableDoesNotExist error failed lookup for key [html5_required] on formsCrispy 表单抛出 VariableDoesNotExist 错误,在表单上查找键 [html5_required] 失败
【发布时间】:2019-12-18 15:53:54
【问题描述】:

我使用 allauth 通过电子邮件登录,并做了一个非常基本的自定义登录表单和一个用于 allauth 的模板覆盖并显示登录表单。点击 URL 会让我直接进入异常:

在 [{'True': True, 'False': False, 'None': None}, {'True': True, 'False': False, 'None': None 中查找键 [html5_required] 失败, 'form': , 'form_show_errors': True, 'form_show_labels': True, 'label_class': '', 'field_class': ''}, {'forloop': {'parentloop': {}, 'counter0': 1, 'counter': 2, 'revcounter': 2, 'revcounter0': 1, 'first': False, 'last': False}, 'field': }, {}]

然后我必须继续调试器两次才能在表单上结束。

我尝试寻找这个特定的[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'

模板/帐户/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 %}

以下代码是使用几乎相同模板的配置文件的基于快速函数的视图:

#in urls.py: path('profile/', views.profile_view, name='user_profile')

#forms.py:
class UserProfileForm(ModelForm):

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

#view.py:
def profile_view(request, *args, **kwargs):
    if request.method == "POST":
        form = UserProfileForm(request.POST)
        if form.is_valid():
            profile = form.save(commit=False)
            profile.user = request.user
            #profile.author = request.user
            #profile.published_date = timezone.now()
            profile.save()
            # TODO: add message or redirect ?!
    else:
        form = UserProfileForm()
    return render(request, 'profile.html', {'form': form})
{% extends 'base.html' %}
{% load crispy_forms_tags %}

{% block content %}

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

我不明白为什么缺少这个键,是我忘记了什么或错过了配置部分吗?

我正在使用的版本:

  • django:2.2.4
  • allauth:0.39.1
  • 脆皮形式:1.7.2
  • 蟒蛇:3.7.4

非常感谢任何指导。

编辑: 我创建了一个完整的新项目作为测试,只使用了清晰的表单,一个只有 2 个字符字段的模型,如上所述的 ModelForm 和模板,并收到了同样的问题。

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

【问题讨论】:

  • 你可以查看这个答案stackoverflow.com/a/20709499/6321954
  • @Enes 我确实遇到了这个答案,但是,在我使用用户配置文件表单的模型表单测试中,我将表单 return render(request, 'profile.html', {'form': form}) 传递到上下文中,但仍然遇到与 [html5_required] 相同的问题不见了。我尝试了具有相同问题的类视图和基于函数的视图。
  • 我在 VS Code 的调试模式下使用 {{ form|crispy }} 标签时遇到了这个问题。如果我只是在运行服务器,我不会收到此消息。 @Tomek 的答案有效,但这不是我想要的,因为我想在我的模板中将多个表单合并为 1。

标签: django django-allauth django-crispy-forms


【解决方案1】:

我将其保留为“部分”答案,因为我不知道为什么或有什么区别(行为),而是将模板中的表单调用更改为:

{{ form|crispy }}

到

{% crispy form %}

摆脱了异常。

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

【讨论】:

    【解决方案2】:

    请允许我总结一下 Github 上的问题。 显然,这是 VS Code 的问题,正如 this respond 中所指出的那样。

    1. 可以通过在您的 launch.json 文件中设置 "django": false 来克服它。但是,这将不再允许您调试模板的呈现。换句话说,在模板中设置断点将不再导致调试器执行在这些点处暂停。有关在 VS Code 中调试 Django 的更多信息,请参阅this tutorial。

    2. 如另一篇文章所述,切换自:

      {{ form|crispy }}
      

      到这里

      {% crispy form %}
      

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

    【讨论】:

      【解决方案3】:

      我遇到了完全相同的问题。

      在基于函数的视图上(用于配置文件)

          #forms.py:
      class UserProfileForm(ModelForm):
      
          class Meta:
              model = UserProfile
              fields = ('gender', 'birthdate')
      

      将以下导入添加到顶部

      from crispy_forms.helper import FormHelper
      

      然后在类定义之后直接创建帮助器

          #forms.py:
      class UserProfileForm(ModelForm):
          helper = FormHelper()
      
          class Meta:
              model = UserProfile
              fields = ('gender', 'birthdate')
      

      我完成了上述操作,它为我解决了这个问题。

      【讨论】:

      • 谢谢,但不幸的是它没有任何区别,它仍然抱怨[html5_required] 仍然丢失。是否还有其他我可能忘记的配置?
      猜你喜欢
      • 2016-01-24
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 2018-02-14
      • 1970-01-01
      • 2012-04-16
      • 2012-08-12
      • 1970-01-01
      相关资源
      最近更新 更多