Formset 不在 UpdateView Django 上保存
Formset Not Saving on UpdateView Django
我在 Formset 上遇到问题,无法在 UpdateView 上保存。
这已在多个 SO post 中进行了讨论,到目前为止,我可以将它们总结为以下
- 确保传递一个实例。因此。 Reference
context['formset'] = journal_entry_formset(self.request.POST, instance=self.object)
- 覆盖 POST 方法。 Reference Another One
我的 UpdateView 是我的 CreateView 的精确副本,除了上面的两个变化。
这是我的 CreateView:
class JournalEntryUpdateView(UpdateView):
model = JournalEntry
template_name = 'add-journal-entry.html'
success_url = reverse_lazy('index')
form_class = JournalEntryForm
def get_context_data(self, *args, **kwargs):
context = super(JournalEntryUpdateView, self).get_context_data(*args, **kwargs)
if self.request.POST:
context['formset'] = journal_entry_formset(self.request.POST, instance=self.object)
else:
context['formset'] = journal_entry_formset(instance=self.object)
return context
def form_valid(self, form):
context = self.get_context_data(form=form)
formset = context['formset']
if formset.is_valid():
response = super().form_valid(form)
formset.instance = self.object
formset.save()
return response
else:
return super().form_invalid(form)
def post(self, request, *args, **kwargs):
self.object = self.get_object()
form_class = self.get_form_class()
form = self.get_form(form_class)
formset = journal_entry_formset(self.request.POST, instance=self.object)
print ("form:", form.is_valid() ) # True
print ("formset:", formset.is_valid() ) # False
print(formset.non_form_errors()) # No Entry
print(formset.errors) # {'id': ['This field is required.']}
if (form.is_valid() and formset.is_valid()):
return self.form_valid(form)
else:
return self.form_invalid(form)
当我点击提交时,页面只是刷新,没有任何反应。 (即我没有那个典型的黄色错误调试屏幕页面)。
我检查了数据库中的值,没有任何变化。
我确实领先。 print(formset.errors)
行产生一个
{'id': ['This field is required.']}
这让我有点困惑,因为据我所知,ID(我假设是 PK)已经在 CreateView 中自动创建,所以我不需要在 UpdateView 中编辑它。
我也在 SO 中搜索它,但大多数答案都是针对像这样的神社模板 one
有解决办法吗?
其实答案已经在最后link(即jinja模板)中了。
只需简单地添加隐藏字段即可按预期工作。
{% for form in formset %}
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
我在 Formset 上遇到问题,无法在 UpdateView 上保存。 这已在多个 SO post 中进行了讨论,到目前为止,我可以将它们总结为以下
- 确保传递一个实例。因此。 Reference
context['formset'] = journal_entry_formset(self.request.POST, instance=self.object)
- 覆盖 POST 方法。 Reference Another One
我的 UpdateView 是我的 CreateView 的精确副本,除了上面的两个变化。
这是我的 CreateView:
class JournalEntryUpdateView(UpdateView):
model = JournalEntry
template_name = 'add-journal-entry.html'
success_url = reverse_lazy('index')
form_class = JournalEntryForm
def get_context_data(self, *args, **kwargs):
context = super(JournalEntryUpdateView, self).get_context_data(*args, **kwargs)
if self.request.POST:
context['formset'] = journal_entry_formset(self.request.POST, instance=self.object)
else:
context['formset'] = journal_entry_formset(instance=self.object)
return context
def form_valid(self, form):
context = self.get_context_data(form=form)
formset = context['formset']
if formset.is_valid():
response = super().form_valid(form)
formset.instance = self.object
formset.save()
return response
else:
return super().form_invalid(form)
def post(self, request, *args, **kwargs):
self.object = self.get_object()
form_class = self.get_form_class()
form = self.get_form(form_class)
formset = journal_entry_formset(self.request.POST, instance=self.object)
print ("form:", form.is_valid() ) # True
print ("formset:", formset.is_valid() ) # False
print(formset.non_form_errors()) # No Entry
print(formset.errors) # {'id': ['This field is required.']}
if (form.is_valid() and formset.is_valid()):
return self.form_valid(form)
else:
return self.form_invalid(form)
当我点击提交时,页面只是刷新,没有任何反应。 (即我没有那个典型的黄色错误调试屏幕页面)。
我检查了数据库中的值,没有任何变化。
我确实领先。 print(formset.errors)
行产生一个
{'id': ['This field is required.']}
这让我有点困惑,因为据我所知,ID(我假设是 PK)已经在 CreateView 中自动创建,所以我不需要在 UpdateView 中编辑它。
我也在 SO 中搜索它,但大多数答案都是针对像这样的神社模板 one
有解决办法吗?
其实答案已经在最后link(即jinja模板)中了。 只需简单地添加隐藏字段即可按预期工作。
{% for form in formset %}
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}