首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何正确地使用crispy表单在模板文件中处理修改后的Django登录表单?

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

Stack Overflow用户
提问于 2015-06-29 14:46:26
回答 2查看 1.7K关注 0票数 1

我有一个修改过的Django登录表单,我必须使用像这个{% crispy formname formname.helper %}这样的长模型在模板文件中处理它。我不能使用短版本({% crispy form %}),因为我必须区分多个表单。问题是,所有这些都适用于普通表单,而不是修改过的Django登录表单。

代码是这样的:

forms.py

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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]的错误。

我该怎么处理呢?

Django 1.6

编辑:

当我想从那个特定的视图调用登录表单时,这个解决方案是有效的,但是当我试图从概要文件/views.py调用它时,就不起作用了。

配置文件/views.py如下所示:

代码语言:javascript
运行
复制
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]

当我将{% crispy form form.helper %}替换为{% crispy login_form login_form.helper %}时,我会得到VariableDoesNotExist at /profiles/whateverurl/: Failed lookup for key [helper]

我还试图将工作视图克隆到概要文件/views.py中,它确实可以工作,但只能独立工作。如果我将新登录视图的模板include到ProfileView的模板中,它将返回上面所示的错误。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-29 15:05:54

Django在模板上下文中的登录视图包括登录表单form。因此,您应该使用:

代码语言:javascript
运行
复制
{% crispy form form.helper %}
票数 2
EN

Stack Overflow用户

发布于 2015-06-29 15:08:40

response = django_login(request, template_name='accounts/login.html', authentication_form=LoginForm)

是一个视图,其上下文中的表单变量名为form

代码语言:javascript
运行
复制
context = {
    'form': form,
    ...
}

因此,您必须使用

代码语言:javascript
运行
复制
{% crispy form form.helper %}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31118718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档