9

Django でクリスピーなフォームを得るために、私は取得し続けますVariableDoesNotExist at / Failed lookup for key [form] in u'[{\'False\': False, \'None\': None,.....

{% extends 'base.html' %}
{% load crispy_forms_tags %}

{% block loginForm %}
    <div class="container" style="padding-bottom: 70px;">
        <div class='row'>
            <div class='col-md-6 col-md-offset-3'>
                <div class="well">
                    <legend>Sign in</legend>
                    <form method="post" action="{% url 'django.contrib.auth.views.login' %}" class="form-horizontal">
                        {% crispy form %}
                        <input type="hidden" name="next" value="{{ next }}"/>
                    </form>
                </div>
            </div>
        </div>
    </div>

{% endblock loginForm %}

フォーム.py:

from django import forms
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, Div, Submit, HTML, Button, Row, Field, Hidden, Fieldset
from crispy_forms.bootstrap import AppendedText, PrependedText, FormActions
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 = 'form-horizontal'
        self.helper.label_class = 'col-lg-2'
        self.helper.field_class = 'col-lg-8'
        self.helper.form_tag = False
        self.helper.layout = Layout(
            Field('username', placeholder="username", css_class='input-xlarge'),
            Field('password', placeholder="Password", css_class='input-xlarge'),
            FormActions(
                Submit('login', 'Login', css_class="btn-primary"),
            )
        )

ドキュメントによると、属性ヘルパーで FormHelper を使用しているため、理解できません。{% クリスピー フォーム %} を使用できるはずです。

4

2 に答える 2

11

template タグの最初の引数は、Crispy Forms がインスタンスをcrispy期待するコンテキスト変数の名前です。したがって、何らかの方法でテンプレート コンテキストでインスタンスをForm取得する必要があります。Formビューでこのフォームを使用していた場合、次のようなことができます

def yourview(request):
    return TemplateResponse(request, "yourtemplate.html", {'form': LoginForm()})

そのフォームを多くの異なるページに配置したい場合は、包含タグをお勧めします:

@register.inclusion_tag('path/to/login_form.html')
def display_login_form():
    return {'form': LoginForm()}

そしてあなたのテンプレートで:

{% load your_template_tags %}
{% display_login_form %}

(カスタム テンプレート タグの通常の設定手順も参照してください)

于 2013-12-20T18:05:52.243 に答える