Skip to main content
 首页 » 编程设计

python之Django 中的 "save and add another"(不是管理员): submit then pre-populate one field of form

2025年05月04日25qlqwjy

我有一个表单“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})