简体   繁体   English

Django内联表单集不删除没有pk的中介模型?

[英]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. 我发现objpk为空,因此从未发生删除。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM