繁体   English   中英

如何使用酥脆的表单在模板文件中正确处理修改后的Django登录表单?

[英]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'))

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 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM