Django 表单视图未接收到数据
Django Form View not receiving data
我正在使用 Django Form View 将一个大的单页表单拆分为一个多页表单,每个表单都有单独的模板。我按照文档和其他在线示例进行操作,大多数情况下一切顺利。
但是,问题是我在表单中有必填字段,但它们验证失败,因为事实证明,数据没有传回 Django(通过覆盖验证 'is_valid()'并打印表单数据,以及在我的模板中打印 {{ wizard.form.errors }})。可能值得注意的是,在我将其拆分之前我将其拆分。
以下是相关代码的简化版本。如果有人有一些建议,那就太好了。我不是这方面的专家,原始代码也不是我写的,所以我会尽我所能回答任何问题。谢谢!:
VIEWS.PY
FORMS = [("venue", RegisterBusinessFormVenue),
("manager", RegisterBusinessFormManager),
("extras", RegisterBusinessFormExtras)]
TEMPLATES = {"venue": "registrationVenue.html",
"manager": "registrationManager.html",
"extras": "registrationExtras.html"}
class RegisterBusinessView(SessionWizardView):
file_storage = FileSystemStorage(location=os.path.join('/var/www/', 'logos'))
def get_template_names(self):
return TEMPLATES[self.steps.current]
def done(self, form_list, **kwargs):
return HttpResponseRedirect(reverse_lazy('submission_page_view'))
MODELS.PY
class RegisterBusinessFormVenue(forms.Form):
venue_name = forms.CharField(label='Venue Name', max_length=128)
class RegisterBusinessFormManager(forms.Form):
manager_first_name = forms.CharField(label='First Name', max_length=255)
class RegisterBusinessFormExtras(forms.Form):
website = forms.URLField(label="Website", required=False)
URLS.PY
url(r'^register/', RegisterBusinessView.as_view(FORMS), name='register_business_view')
模板
{% extends "base.html" %}
{% load staticfiles %}
{% block stylesheet %}
<link rel="stylesheet" href="{% static 'css/registration.css' %}">
{% endblock stylesheet %}
{% block content %}
<div class="page-header">
<h1>Register your business</h1>
</div>
<form class="form-horizontal" role="form" action="" method="POST">{% csrf_token %}
{{ wizard.management_form }}
{{ wizard.form.errors}}
{{ wizard.form.non_field_errors}}
<legend>Event Venue Information</legend>
<div class="form-group required {% if wizard.form.venue_name.errors %}has-error{% endif %}">
<label for="inputVenueName" class="col-sm-3 control-label">{{ wizard.form.venue_name.label }}</label>
<div class="col-sm-9">
<input type="text" class="form-control"
name="{{ wizard.form.venue_name.name }}"
id="inputVenueName"
{% if wizard.form.venue_name.value %}value="{{ wizard.form.venue_name.value }}"{% endif %}
placeholder="Venue name where events are held"
spellcheck="true">
</div>
</div>
<div class="register-btn-block">
<button type="submit">Register</button>
</div>
</form>
{% endblock content %}
我回答了我自己的问题。这对我来说是一个愚蠢的错误:我没有使用向导为我的 html 标记提供的 ID 和名称。在我上面的模板中,我有 'label for' 和 'id' 属性,它们应该填充值“{{ wizard.form.venue_name.id_for_label }}”。对于 'name' 属性,它应该填充为“{{ wizard.form.venue_name.html_name }}”。
找到可以使用的预定义值here。进行这些更改后,表单数据已正确提交到服务器。
我正在使用 Django Form View 将一个大的单页表单拆分为一个多页表单,每个表单都有单独的模板。我按照文档和其他在线示例进行操作,大多数情况下一切顺利。
但是,问题是我在表单中有必填字段,但它们验证失败,因为事实证明,数据没有传回 Django(通过覆盖验证 'is_valid()'并打印表单数据,以及在我的模板中打印 {{ wizard.form.errors }})。可能值得注意的是,在我将其拆分之前我将其拆分。
以下是相关代码的简化版本。如果有人有一些建议,那就太好了。我不是这方面的专家,原始代码也不是我写的,所以我会尽我所能回答任何问题。谢谢!:
VIEWS.PY
FORMS = [("venue", RegisterBusinessFormVenue),
("manager", RegisterBusinessFormManager),
("extras", RegisterBusinessFormExtras)]
TEMPLATES = {"venue": "registrationVenue.html",
"manager": "registrationManager.html",
"extras": "registrationExtras.html"}
class RegisterBusinessView(SessionWizardView):
file_storage = FileSystemStorage(location=os.path.join('/var/www/', 'logos'))
def get_template_names(self):
return TEMPLATES[self.steps.current]
def done(self, form_list, **kwargs):
return HttpResponseRedirect(reverse_lazy('submission_page_view'))
MODELS.PY
class RegisterBusinessFormVenue(forms.Form):
venue_name = forms.CharField(label='Venue Name', max_length=128)
class RegisterBusinessFormManager(forms.Form):
manager_first_name = forms.CharField(label='First Name', max_length=255)
class RegisterBusinessFormExtras(forms.Form):
website = forms.URLField(label="Website", required=False)
URLS.PY
url(r'^register/', RegisterBusinessView.as_view(FORMS), name='register_business_view')
模板
{% extends "base.html" %}
{% load staticfiles %}
{% block stylesheet %}
<link rel="stylesheet" href="{% static 'css/registration.css' %}">
{% endblock stylesheet %}
{% block content %}
<div class="page-header">
<h1>Register your business</h1>
</div>
<form class="form-horizontal" role="form" action="" method="POST">{% csrf_token %}
{{ wizard.management_form }}
{{ wizard.form.errors}}
{{ wizard.form.non_field_errors}}
<legend>Event Venue Information</legend>
<div class="form-group required {% if wizard.form.venue_name.errors %}has-error{% endif %}">
<label for="inputVenueName" class="col-sm-3 control-label">{{ wizard.form.venue_name.label }}</label>
<div class="col-sm-9">
<input type="text" class="form-control"
name="{{ wizard.form.venue_name.name }}"
id="inputVenueName"
{% if wizard.form.venue_name.value %}value="{{ wizard.form.venue_name.value }}"{% endif %}
placeholder="Venue name where events are held"
spellcheck="true">
</div>
</div>
<div class="register-btn-block">
<button type="submit">Register</button>
</div>
</form>
{% endblock content %}
我回答了我自己的问题。这对我来说是一个愚蠢的错误:我没有使用向导为我的 html 标记提供的 ID 和名称。在我上面的模板中,我有 'label for' 和 'id' 属性,它们应该填充值“{{ wizard.form.venue_name.id_for_label }}”。对于 'name' 属性,它应该填充为“{{ wizard.form.venue_name.html_name }}”。
找到可以使用的预定义值here。进行这些更改后,表单数据已正确提交到服务器。