我有一个表单“results”,其中一个字段“subjectID”是多对多的,因为每个主题都有多个结果。我想要一个提交按钮让我保存我输入的内容,然后重定向到相同的表单,现在未绑定(bind),除了多对多“subjectID”字段保持不变,以便我可以为该主题输入更多结果.
编辑:我应该明确表示我希望我在 subjectID 字段中选择的实例保持不变。我在下面发布了实际上似乎对我有用的代码
来自模型.py
class ResultsForm(forms.Modelform):
class Meta:
model = models.Results
fields = ['subjectID', # this is the field want
# to populate the form with when I "save and add another"
'slideNum', # IntegerField
'resultType' ] # ForeignKey
来自 views.py
def addResults(request):
if request.method == 'POST'
form = ResultsForm(request.POST)
if form.is_valid():
form.save()
if 'Save_and_add_another' in request.POST:
subjectID = form.fields['subjectID']
prepop = {'subjectID' : subjectID}
form = ResultsForm(initial=prepop)
return render(request, 'slideAdmin/addResults.html', {'form': form})
elif 'Save_and_return' in request.POST:
return HttpResponseRedirect('/home/')
else:
form = ResultsForm()
return render(request, 'slideAdmin/addResults.html', {'form': form})
现在,当我从我的 addResults 表单中点击“保存并添加另一个”时,我收到了这个错误:
TypeError at /slidebox/addResults
'ModelMultipleChoiceField' object is not iterable
在模板中呈现 {{ form.as_p }} 时发生。
编辑:我对 views.py 所做的更改
if 'Save_and_add_another' in request.POST:
subjectID = form.cleaned_data.get('subjectID')
form = ResultsForm(initial={'subjectID': subjectID})
return render(request, 'slideAdmin/addResults.html', {'form': form})
据我所知,此更改有效。再次感谢
请您参考如下方法:
您应该始终使用 form.cleaned_data.get('subjectID') 而不是直接从发布数据中提取字段。您需要传入 M2M 字段的 pk 列表。
您的 View 还可以使用一些清理:
from django.core.urlresolvers import reverse
def addResults(request):
form = ResultsForm(request.POST or None)
if request.method == 'POST' and form.is_valid():
form.save()
if 'Save_and_add_another' in request.POST:
subjectID = form.cleaned_data.get('subjectID', [])
if subjectID:
subjectID = subjectIDs.split(',')
form = ResultsForm(initial={'subjectID': subjectID})
elif 'Save_and_return' in request.POST:
return HttpResponseRedirect(reverse('home')) # don't hard code
return render(request, 'slideAdmin/addResults.html', {'form': form})
