问题描述
我可以在 post 方法中保存表单集,但是当我尝试在我的“put”方法中编辑它时,我的 formset.is_valid 返回 false ... 我排除了此代码示例中的一些逻辑并将其替换为 .... 所以更容易阅读...
希望这是足够的信息来了解我的问题
我的view.py
class AngebotView(View):
def get(self,request,id=None):
if id: # edit view
.................
raum_formset = RaumFormSet(queryset=objekt.t_raum_set.all())
raum_formset.extra = 0 #set extra to 0,otherwise there is always a additional form in the edit view
template = 'angebot/edit_angebot.html'
else: # create view
.....................
# Create an instance of the formset
raum_formset = RaumFormSet(queryset=T_Raum.objects.none())
template = 'angebot/new_angebot.html'
context = {'kunde_form': kunde_form,'angebot_form': angebot_form,'objekt_form': objekt_form,'raum_formset': raum_formset}
return render(request,template,context)
def post(self,id=None): # Post = save/edit
context = {}
if id:
return self.put(request,id) #when id then PUT = EDIT
........
formset_raum = RaumFormSet(data=self.request.POST)
# wenn die Eingabe der Formen passt
if formset_raum.is_valid():
..................
raum_instances = formset_raum.save(commit=False)
for new_raum in raum_instances:
new_raum.objektid = new_objekt #set foreign key
new_raum.save()
messages.success(request,'Angebot wurde gespeichert!')
return HttpResponseRedirect(reverse('angebot:angebot_details',kwargs={'id': new_angebot.id}))
else:
# Todo: Errorhandling
raise Http404
context = {'angebot_form': angebot_form,'kunde_form': kunde_form,'raum_formset': formset_raum}
return render(request,'angebot/new_angebot.html',context)
def put(self,id=None): # save the edit
context = {}
.................
formset_raum = RaumFormSet(data=self.request.POST)
if formset_raum.is_valid(): #this is not working !!!!
raum_instances = formset_raum.save(commit=False)
for new_raum in raum_instances:
new_raum.objektid = new_objekt # set foreign key
new_raum.save()
messages.success(request,'Angebot wurde erfolgreich geändert!')
return HttpResponseRedirect(reverse('angebot:angebot_details',kwargs={'id': new_angebot.id}))
else:
messages.warning(request,'Eingabe -- Invalid')
context = {'angebot_form': angebot_form,'raum_formset': formset_raum}
return render(request,'angebot/edit_angebot.html',context)
forms.py
RaumFormSet = modelformset_factory(
T_Raum,fields=("name","hoehe",'flaeche','anzfenster','anzaussenflaechen','alternative','anzS','anzM','anzL','anzManuellUeberschrieben'),extra=1
)
edit_angebot.html 模板:
{{raum_formset.management_form}}
{% for raum in raum_formset %}
<tr id="rowToClone">
<td> {{ raum.name }} </td>
<td> {{ raum.hoehe }} </td>
<td> {{ raum.flaeche }} </td>
<td> {{ raum.anzfenster }} </td>
<td> {{ raum.anzaussenflaechen }} </td>
<td> {{ raum.alternative }} </td>
</tr>
{% endfor %}
已经搜索了一段时间,但无法让它工作??
希望得到任何帮助!!!
解决方法
终于搞定了!!
经过长时间的调试和搜索,我发现了错误。 喜欢这篇文章 django formset not validating because ID is required 我不得不将 {{ form.id }} 添加到我的模板循环中... id 不会显示在 html 页面上,但不知何故在编辑模式下需要....
感谢用户 J-a-n-u-s: 作为@unixo 答案的附录,简单地说: {{ form.id }}