<p>假设您希望第一个表单的结果确定第二个表单的字段数及其标签,您可能需要查看<a href="https://docs.djangoproject.com/en/dev/ref/contrib/formtools/form-wizard/" rel="noreferrer">Django form wizards</a>。但是这里有一个简单的、非表单向导(而且可能不太理想/不易维护)的方法,使用formset的<code>__init__</code>方法来修改表单标签*:</p>
<hr/>
<p>在表单.py公司名称:</p>
<pre><code># File: forms.py
from django import forms
from django.forms.formsets import BaseFormSet
# What you've called 'GetMachine'
class MachineForm(forms.Form):
no_of_lines = forms.IntegerField(max_value=4)
# What you've called 'GetLine'
class LineForm(forms.Form):
beamline_name = forms.CharField(max_length=15, label='Name of Beamline')
# Create a custom formset and override __init__
class BaseLineFormSet(BaseFormSet):
def __init__(self, *args, **kwargs):
super(BaseLineFormSet, self).__init__(*args, **kwargs)
no_of_forms = len(self)
for i in range(0, no_of_forms):
self[i].fields['beamline_name'].label += "-%d" % (i + 1)
</code></pre>
<p>在视图.py公司名称:</p>
^{2}$
<p>在网址.py公司名称:</p>
<pre><code>from django.conf.urls import url, patterns
from views import get_no_of_lines, line_form
urlpatterns = patterns('',
url(r'^$', get_no_of_lines, name='get_no_of_lines'),
url(r'^line_form/(?P<no_of_lines>\d{1})$', line_form, name='line_form'),
)
</code></pre>
<p>得到_行.html公司名称:</p>
<pre><code><form method="POST">
{% csrf_token %}
{{ machine_form }}
</form>
</code></pre>
<p>线路_表单.html公司名称:</p>
<pre><code><form method="POST">
{% csrf_token %}
{{ formset.as_p }}
</code></pre>
<hr/>
<p>我之所以说这种方法可能不是最好的方法,是因为您必须验证传递给<code>line_form</code>视图的<code>no_of_lines</code>(可能是>;4,因此您必须在这里执行验证并引入验证逻辑,而不是将其放在一个地方—表单)。如果您需要在第一个表单中添加一个新字段,那么您可能最终不得不修改代码。因此,我建议研究<a href="https://docs.djangoproject.com/en/dev/ref/contrib/formtools/form-wizard/" rel="noreferrer">form wizards</a>。在</p>
<hr/>
<ul>
<li>对于更多或动态表单,请查看<a href="http://jacobian.org/writing/dynamic-form-generation/" rel="noreferrer">Jacob Kaplan-Moss's post on dynamic form generation</a>。在</li>
</ul>