Django formtools 向导生成空白页(未返回错误)
Django formtools wizard produces blank page (No error returned)
我试图在 formtools 包中使用 formwizard 但没有成功(当包在早期版本的 Django 中时我能够做到这一点)。
我得到的唯一回复是:
[23/Jan/2016 11:06:50]"GET /registration/wizard HTTP/1.1" 200 13729
和一个空白页。浏览器或 Eclipse 控制台中没有错误。
谷歌搜索不可能没有错误。请帮忙
提前致谢
我做了什么?
首先,我用 pip 安装了 formtools 包:
django-formtools==1.0
Django==1.8.3
按照官方文档的说明:
定义表格类
registration/forms.py
class StepForm1(forms.Form):
first_field = forms.CharField(max_length=100)
second_field = forms.CharField()
class StepForm2(forms.Form):
message = forms.CharField(widget=forms.Textarea)
创建 WizardView
registration/views.py
TEST_TEMPLATES = {"test_step_1": "registration/test_step1.html", "test_step_2": "registration/test_step2.html", }
from formtools.wizard.views import SessionWizardView
class WizardTest(SessionWizardView):
template_name = 'registration/test_wizard.html'
# Return templates for each step
def get_templates_name(self):
return [TEST_TEMPLATES[self.steps.current]]
# Method called when all is done
def done(self, form_list, **kwargs):
# return HttpResponseRedirect('/url-to-redirect-to/')
# We return the final template with the info
return render_to_response('test_done.html', {
'form_data':[form.cleaned_data for form in form_list],
})
# THESE METHODS BELOW ARE NOT NEEDED, BUT COMMENTED FOR FUTURE USE
# Not strictly needed. Returns data for a step
# or None if form is not valid
# def get_cleaned_data_for_step(self, step):
# return None
# Form data postprocessing in a concrete wizard step
# def process_step(self, form):
# return self.get_form_step_data(form)
# Handles value from a step before storing them into wizard
# def get_form_step_data(self, form):
# return form.data
创建模板
registration/test_step1.html
<h1>Two fields form</h1>
<input id="first_field" name="first_field">
<input id="second_field" name="second_field">
registration/test_step2.html
<h1>Message form</h1>
<input id="message" name="message">
registration/test_wizard.html
{% extends "person/alumnos.html" %}
{% load i18n %}
{% block head %}
{{ wizard.form.media }}
{% endblock head %}
{% block content %}
<p>{% trans "Step {{wizard.steps.step1}} of {{wizard.steps.count}}" %}</p>
<form action="" method="post">
{% csrf_token %}
{{ wizard.management_form }}
{% if wizard.form.forms %}
{{ wizard.form.management_form }}
{% for form in wizard.form.forms %}
{{form}}
{% endfor %}
{% else %}
{{ wizard.form }}
{% endif %}
{% if wizard.steps.prev %}
<button name="wizard_goto_step" type="submit" value="{{ wizard.steps.first }}">{% trans "Beginning" %}</button>
<button name="wizard_goto_step" type="submit" value="{{ wizard.steps.prev }}">{% trans "Previous step" %}</button>
{% endif %}
<input type="submit" value="submit"/>
</form>
{% endblock %}
将'formtools'添加到我的INSTALLED_APPS
settings.py
DJANGO_APPS = (
# Default Django apps:
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'formtools', # <===== HERE
# Useful template tags:
# 'django.contrib.humanize',
# Admin panel and documentation:
'django.contrib.admin',
# 'django.contrib.admindocs',
)
# Apps specific for this project go here.
LOCAL_APPS = (
'person',
'registration',
'teaching',
'utils',
)
# See: https://docs.djangoproject.com/en/dev/ref/settings/#installed-apps
INSTALLED_APPS = DJANGO_APPS + LOCAL_APPS
- 将我的 URLconf 指向您的 WizardView as_view() 方法。
registration/urls.py
from registration.forms import StepForm1, StepForm2
TEST_FORMS = [("test_step_1", StepForm1), ("test_step_2", StepForm2), ]
from registration.views import WizardTest
# I tried in two ways, none of them worked
urlpatterns = patterns('',
url(r'^wizard$', WizardTest.as_view(TEST_FORMS), name='wizard_test'),
url(r'^wizard2$', views.wizard, name='wizard_test'),
)
对于第二种方式...
registration/views.py
def wizard(request):
return WizardTest.as_view(TEST_FORMS)(request)
您的模板遵循什么示例? The basic layout is in the docs。尝试从这样的开始(如果您对 formtools 生成的字段没有问题,两个页面可以使用相同的模板):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Form Wizard</title>
{{ wizard.form.media }}
</head>
<body>
{% load i18n %}
<p>Step {{ wizard.steps.step1 }} of {{ wizard.steps.count }}</p>
<form action="" method="post">{% csrf_token %}
<table>
{{ wizard.management_form }}
{% if wizard.form.forms %}
{{ wizard.form.management_form }}
{% for form in wizard.form.forms %}
{{ form }}
{% endfor %}
{% else %}
{{ wizard.form }}
{% endif %}
</table>
{% if wizard.steps.prev %}
<button name="wizard_goto_step" type="submit" value="{{ wizard.steps.first }}">{% trans "first step" %}</button>
<button name="wizard_goto_step" type="submit" value="{{ wizard.steps.prev }}">{% trans "prev step" %}</button>
{% endif %}
<input type="submit" name="submit" value="{% trans "submit" %}"/>
</form>
</body>
</html>
我发现了我的错误。我错误地输入了获取模板的方法名称。不是
get_templates_name(self)
但是
get_template_names(self)
它没有获得任何模板,但是当它返回到服务器时它用 HTTP 200 OK 进行应答,因为它没有发现任何错误。
我还发现我的每个步骤的模板都应该扩展主向导模板才能正常工作。使用 'done' 模板不是必需的。
导致 self.cleaned_data['field']
对我来说为空的主要问题是我需要使用 form.field.html_name
而不是 form.field.name
作为模板的名称字段。
但是,从 Django formtools 提供的文档中,这并不是那么清楚。这是我的模板页面的摘录,所以它更清楚:
<div class="form-group">
<label>{{ form.account_name.label }}</label>
<input name="{{ form.account_name.html_name }}"
value="{{ form.account_name.value|default_if_none:'' }}"
class="form-control">
</div>
我试图在 formtools 包中使用 formwizard 但没有成功(当包在早期版本的 Django 中时我能够做到这一点)。
我得到的唯一回复是:
[23/Jan/2016 11:06:50]"GET /registration/wizard HTTP/1.1" 200 13729
和一个空白页。浏览器或 Eclipse 控制台中没有错误。
谷歌搜索不可能没有错误。请帮忙
提前致谢
我做了什么?
首先,我用 pip 安装了 formtools 包:
django-formtools==1.0
Django==1.8.3
按照官方文档的说明:
定义表格类
registration/forms.py
class StepForm1(forms.Form): first_field = forms.CharField(max_length=100) second_field = forms.CharField() class StepForm2(forms.Form): message = forms.CharField(widget=forms.Textarea)
创建 WizardView
registration/views.py
TEST_TEMPLATES = {"test_step_1": "registration/test_step1.html", "test_step_2": "registration/test_step2.html", } from formtools.wizard.views import SessionWizardView class WizardTest(SessionWizardView): template_name = 'registration/test_wizard.html' # Return templates for each step def get_templates_name(self): return [TEST_TEMPLATES[self.steps.current]] # Method called when all is done def done(self, form_list, **kwargs): # return HttpResponseRedirect('/url-to-redirect-to/') # We return the final template with the info return render_to_response('test_done.html', { 'form_data':[form.cleaned_data for form in form_list], }) # THESE METHODS BELOW ARE NOT NEEDED, BUT COMMENTED FOR FUTURE USE # Not strictly needed. Returns data for a step # or None if form is not valid # def get_cleaned_data_for_step(self, step): # return None # Form data postprocessing in a concrete wizard step # def process_step(self, form): # return self.get_form_step_data(form) # Handles value from a step before storing them into wizard # def get_form_step_data(self, form): # return form.data
创建模板
registration/test_step1.html
<h1>Two fields form</h1> <input id="first_field" name="first_field"> <input id="second_field" name="second_field">
registration/test_step2.html
<h1>Message form</h1> <input id="message" name="message">
registration/test_wizard.html
{% extends "person/alumnos.html" %} {% load i18n %} {% block head %} {{ wizard.form.media }} {% endblock head %} {% block content %} <p>{% trans "Step {{wizard.steps.step1}} of {{wizard.steps.count}}" %}</p> <form action="" method="post"> {% csrf_token %} {{ wizard.management_form }} {% if wizard.form.forms %} {{ wizard.form.management_form }} {% for form in wizard.form.forms %} {{form}} {% endfor %} {% else %} {{ wizard.form }} {% endif %} {% if wizard.steps.prev %} <button name="wizard_goto_step" type="submit" value="{{ wizard.steps.first }}">{% trans "Beginning" %}</button> <button name="wizard_goto_step" type="submit" value="{{ wizard.steps.prev }}">{% trans "Previous step" %}</button> {% endif %} <input type="submit" value="submit"/> </form> {% endblock %}
将'formtools'添加到我的INSTALLED_APPS
settings.py
DJANGO_APPS = ( # Default Django apps: 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.staticfiles', 'formtools', # <===== HERE # Useful template tags: # 'django.contrib.humanize', # Admin panel and documentation: 'django.contrib.admin', # 'django.contrib.admindocs', ) # Apps specific for this project go here. LOCAL_APPS = ( 'person', 'registration', 'teaching', 'utils', ) # See: https://docs.djangoproject.com/en/dev/ref/settings/#installed-apps INSTALLED_APPS = DJANGO_APPS + LOCAL_APPS
- 将我的 URLconf 指向您的 WizardView as_view() 方法。
registration/urls.py
from registration.forms import StepForm1, StepForm2
TEST_FORMS = [("test_step_1", StepForm1), ("test_step_2", StepForm2), ]
from registration.views import WizardTest
# I tried in two ways, none of them worked
urlpatterns = patterns('',
url(r'^wizard$', WizardTest.as_view(TEST_FORMS), name='wizard_test'),
url(r'^wizard2$', views.wizard, name='wizard_test'),
)
对于第二种方式...
registration/views.py
def wizard(request):
return WizardTest.as_view(TEST_FORMS)(request)
您的模板遵循什么示例? The basic layout is in the docs。尝试从这样的开始(如果您对 formtools 生成的字段没有问题,两个页面可以使用相同的模板):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Form Wizard</title>
{{ wizard.form.media }}
</head>
<body>
{% load i18n %}
<p>Step {{ wizard.steps.step1 }} of {{ wizard.steps.count }}</p>
<form action="" method="post">{% csrf_token %}
<table>
{{ wizard.management_form }}
{% if wizard.form.forms %}
{{ wizard.form.management_form }}
{% for form in wizard.form.forms %}
{{ form }}
{% endfor %}
{% else %}
{{ wizard.form }}
{% endif %}
</table>
{% if wizard.steps.prev %}
<button name="wizard_goto_step" type="submit" value="{{ wizard.steps.first }}">{% trans "first step" %}</button>
<button name="wizard_goto_step" type="submit" value="{{ wizard.steps.prev }}">{% trans "prev step" %}</button>
{% endif %}
<input type="submit" name="submit" value="{% trans "submit" %}"/>
</form>
</body>
</html>
我发现了我的错误。我错误地输入了获取模板的方法名称。不是
get_templates_name(self)
但是
get_template_names(self)
它没有获得任何模板,但是当它返回到服务器时它用 HTTP 200 OK 进行应答,因为它没有发现任何错误。
我还发现我的每个步骤的模板都应该扩展主向导模板才能正常工作。使用 'done' 模板不是必需的。
导致 self.cleaned_data['field']
对我来说为空的主要问题是我需要使用 form.field.html_name
而不是 form.field.name
作为模板的名称字段。
但是,从 Django formtools 提供的文档中,这并不是那么清楚。这是我的模板页面的摘录,所以它更清楚:
<div class="form-group">
<label>{{ form.account_name.label }}</label>
<input name="{{ form.account_name.html_name }}"
value="{{ form.account_name.value|default_if_none:'' }}"
class="form-control">
</div>