[英]Django Inline formset not deleting intermediary model with no pk?
I have implemented an inline formset from this accepted answer 我已经从接受的答案中实现了内联表单集
I am having an issue when saving the formset namely, it does not delete records 保存表单集时出现问题,即不删除记录
We can trace it into the formsets save method
: 我们可以将其
formsets save method
:
def form_valid(self, form):
'''Handle saving of the project membership formset
'''
context = self.get_context_data()
project_memberships = context['projectmembership_formset']
if project_memberships.is_valid():
self.object = form.save()
project_memberships.instance = self.object
project_memberships.save()
And if we step deeper into the save
method we get to: 如果我们更深入地进入
save
方法,我们将获得:
def save_existing_objects(self, commit=True):
self.changed_objects = []
self.deleted_objects = []
if not self.initial_forms:
return []
saved_instances = []
forms_to_delete = self.deleted_forms
for form in self.initial_forms:
obj = form.instance
# If the pk is None, it means either:
# 1. The object is an unexpected empty model, created by invalid
# POST data such as an object outside the formset's queryset.
# 2. The object was already deleted from the database.
if obj.pk is None:
continue
if form in forms_to_delete:
self.deleted_objects.append(obj)
self.delete_existing(obj, commit=commit)
elif form.has_changed():
self.changed_objects.append((obj, form.changed_data))
saved_instances.append(self.save_existing(form, obj, commit=commit))
if not commit:
self.saved_forms.append(form)
return saved_instances
What I find is that the pk
of the obj
is empty and hence no deletion ever happens. 我发现
obj
的pk
为空,因此从未发生删除。
POST
Data: POST
数据:
'projectmembership_set-0-id': [
'8'
],
'projectmembership_set-0-user': [
'1'
],
'projectmembership_set-0-is_project_manager': [
'on'
],
'projectmembership_set-0-full_time_equivalent': [
'100.00'
],
'projectmembership_set-0-DELETE': [
'on'
],
'projectmembership_set-1-id': [
'9'
],
'projectmembership_set-1-user': [
'3'
],
'projectmembership_set-1-is_project_manager': [
'on'
],
'projectmembership_set-1-full_time_equivalent': [
'100.00'
],
'projectmembership_set-1-DELETE': [
'on'
],
'projectmembership_set-2-id': [
'10'
],
'projectmembership_set-2-user': [
'7'
],
'projectmembership_set-2-full_time_equivalent': [
'50.00'
],
'projectmembership_set-2-DELETE': [
'on'
],
Why do the objects not have a pk
and are not deleted? 为什么对象没有
pk
并且没有被删除?
Based on the answers to Class based viewINline formset 基于基于类的viewINline表单集的答案
The get_context_data
with the POST
data in the UpdateView
needs to be given an instance as well. UpdateView
需要为get_context_data
具有POST
数据的UpdateView
提供实例。
if self.request.POST:
context['projectmembership_formset'] = ProjectMembershipFormSet(
self.request.POST,
instance=self.object
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.