脆皮表单在表单

时间:2019-08-12 01:57:19

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

我使用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”进行了测试,只显示了两个字段,并遇到了相同的问题。

我尝试了两种:基于类的视图(用于Login)和基于函数的视图(用于Profile),但是在这两者上我都遇到了相同的问题。

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 %}

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

#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
  • python:3.7.4

非常感谢任何指导。

编辑: 我创建了一个完整的新项目作为测试,该测试仅包含简洁的表单,仅包含2个字符字段的模型,如上所述的ModelForm和模板,并且收到相同的问题。

所以我做错了什么/缺少了什么,或者有问题, 我还提出了他们的github问题https://github.com/django-crispy-forms/django-crispy-forms/issues/891

3 个答案:

答案 0 :(得分:1)

我将其保留为“部分”答案,因为我不知道原因(或行为上的差异)是什么,而是将对模板中表单的调用从以下位置更改:

{{ form|crispy }}

{% crispy form %}

摆脱了异常。

然后,就像@ skilled-in-blockchain提到的那样,我可以在表单中添加FormHelper进行其他修改。谢谢。

答案 1 :(得分:1)

让我总结一下Github上的问题。 显然,这是this respond中指出的VS Code问题。

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

  2. 如另一篇文章所述,从以下位置切换:

    {{ form|crispy }}
    

    对此

    {% crispy form %}
    

    也解决了该问题。但是,这还需要您使用FormHelper来插入按钮或id或更多按钮。查看crispy form's documentation on the fundamentels的用法。

答案 2 :(得分:0)

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

在基于功能的视图(对于Profile)上

buildah build-using-dockerfile

将以下导入内容添加到顶部

    #forms.py:
class UserProfileForm(ModelForm):

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

然后在类定义之后立即创建帮助器

from crispy_forms.helper import FormHelper

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