我使用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 %}
我不明白为什么缺少此密钥,是否忘记了某些内容或错过了配置部件?
我使用的版本:
非常感谢任何指导。
编辑: 我创建了一个完整的新项目作为测试,该测试仅包含简洁的表单,仅包含2个字符字段的模型,如上所述的ModelForm和模板,并且收到相同的问题。
所以我做错了什么/缺少了什么,或者有问题, 我还提出了他们的github问题https://github.com/django-crispy-forms/django-crispy-forms/issues/891
答案 0 :(得分:1)
我将其保留为“部分”答案,因为我不知道原因(或行为上的差异)是什么,而是将对模板中表单的调用从以下位置更改:
{{ form|crispy }}
到
{% crispy form %}
摆脱了异常。
然后,就像@ skilled-in-blockchain提到的那样,我可以在表单中添加FormHelper
进行其他修改。谢谢。
答案 1 :(得分:1)
让我总结一下Github上的问题。 显然,这是this respond中指出的VS Code问题。
可以通过在launch.json文件中设置"django": false
来解决。但是,这将不再允许您调试模板的呈现。换句话说,在模板中设置断点将不再导致调试器在这些点处暂停执行。有关在VS Code中调试Django的更多信息,请参见this tutorial。
如另一篇文章所述,从以下位置切换:
{{ 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
我做了上面的工作,它为我解决了这个问题。