<p>有更好的方法:</p>
<ul>
<li>如果使用<code>inlineformset_factory</code>,则可以在初始化表单集时直接传递表单集所属的教师实例。参见示例<a href="https://docs.djangoproject.com/en/2.2/topics/forms/modelforms/#inline-formsets" rel="nofollow noreferrer">here</a></李>
<li><p>或者可以在表单中循环,以便在保存实例之前对其进行修改:</p>
<pre><code>instances = formset.save(commit=False)
for instance in instances:
instance.classteacher = ...
instance.save()
</code></pre></li>
</ul>
<p>如果希望用户提交所有实例共用的额外字段,可以向视图中添加其他窗体:</p>
<pre><code>class DayForm(forms.Form):
day = ModelChoiceField(queryset=Day.objects.all())
def get_context_data(self, **kwargs):
...
context['day_form'] = DayForm()
return context
def post(self, *args, **kwargs):
...
day_form = DayForm(data=request.POST)
if formset.is_valid() and day_form.is_valid():
return self.form_valid(formset, day_form)
def form_valid(self, formset, day_form):
day = day_form.cleaned_data['day']
instances = formset.save(commit=False)
for instance in instances:
instance.day = day
instance.teacher = ...
instance.save()
return HttpResponseRedirect(...)
</code></pre>
<h3>要渲染的模板</h3>
<pre class="lang-html prettyprint-override"><code><form class="form-material m-t-40 floating-labels" method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ day_form }} <br>
{{ formset.management_form }}
{% for form in formset %}
{{ form }}<br><br>
{% endfor %}
<div class="form-group row">
<button type="submit" class="btn waves-effect waves-light btn-rounded btn-success">
Submit
</button>
</div>
</form>
</code></pre>