[英]How to properly address a modified Django login form in the template files using crispy forms?
我有一个经过修改的Django登录表单,我必须使用像{% crispy formname formname.helper %}
这样的长模型在模板文件中解决它。 我不能使用简短版本( {% crispy form %}
),因为我必须区分多种形式。 事实是,所有这些都适用于普通表单,但不适用于修改后的Django登录表单。
代码如下:
from crispy_forms.helper import FormHelper
from django.contrib.auth.forms import AuthenticationForm
class LoginForm(AuthenticationForm):
def __init__(self, *args, **kwargs):
super(LoginForm, self).__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.form_class = 'login-form'
self.helper.form_show_labels = False
self.helper.layout = Layout(
Field('username', placeholder="E-mail"),
Field('password', placeholder="Password")
)
self.helper.add_input(Submit('submit', 'Log in', css_class='btn-block btn-inset'))
from django.contrib.auth import authenticate, login as auth_login, REDIRECT_FIELD_NAME
from django.contrib.auth.views import login as django_login
from accounts.forms import LoginForm
from django.http import HttpResponseRedirect
def login(request):
if request.user.is_authenticated():
return HttpResponseRedirect('/profiles/create/')
else:
response = django_login(request, template_name='accounts/login.html', authentication_form=LoginForm)
return response
当我尝试以{% crispy response response.helper %}
的形式在模板中解决该问题时,我仅VariableDoesNotExist at /accounts/whateverurl/: Failed lookup for key [response]
收到一个指出VariableDoesNotExist at /accounts/whateverurl/: Failed lookup for key [response]
的错误VariableDoesNotExist at /accounts/whateverurl/: Failed lookup for key [response]
。
我该如何解决?
Django 1.6
当我想从该特定视图调用登录表单时,该解决方案有效,但是当我尝试从profile / views.py调用登录表单时,解决方案就不多了。
profile / views.py看起来像这样:
from django.contrib.auth import authenticate, login as auth_login, REDIRECT_FIELD_NAME
from django.contrib.auth.views import login as django_login
from django.views.generic import DetailView
from accounts.forms import LoginForm, RegisterForm
from accounts.views import get_redirect_url
class ProfileView(DetailView):
model = Profile
def get(self, request, *args, **kwargs):
#lots of irrelevant code#
if request.user.is_authenticated():
pass
else:
login_form = django_login(request, template_name='accounts/login.html', authentication_form=LoginForm).render()
#lots of irrelevant code#
context.update({
#lots of irrelevant code#
'login_form': login_form,
})
我什至需要更新login_form的上下文吗? 无论如何,像这样使用它,我VariableDoesNotExist at /profiles/whateverurl/: Failed lookup for key [form]
得到了相同的VariableDoesNotExist at /profiles/whateverurl/: Failed lookup for key [form]
。
当我将{% crispy form form.helper %}
替换为{% crispy login_form login_form.helper %}
我VariableDoesNotExist at /profiles/whateverurl/: Failed lookup for key [helper]
得到VariableDoesNotExist at /profiles/whateverurl/: Failed lookup for key [helper]
。
我还尝试将工作视图克隆到profile / views.py中 ,它确实可以工作,但只能独立工作。 如果我include
新的登录视图的模板到ProfileView的模板,它返回上述错误。
Django的登录视图在模板上下文中将登录表单包括为form
。 因此,您应该使用:
{% crispy form form.helper %}
response = django_login(request, template_name='accounts/login.html', authentication_form=LoginForm)
是一个视图,其上下文中的form变量名为form
:
context = {
'form': form,
...
}
因此,您必须使用
{% crispy form form.helper %}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.