Python 编辑Django formset数据创建新记录而不是更新

Python 编辑Django formset数据创建新记录而不是更新,python,django,Python,Django,请帮忙 我正在尝试更新一组由主窗体pk与主窗体(项目信息)相关的窗体集。create表单工作得很好,但是我发现实现更新版本非常困难 对于表单集,我无法理解的是另存为更新部分。主窗体正确更新数据库。表单集只是创建新记录,而不是更新现有记录。我不知道如何引用表单集 这是代码 view.py @login_required def edit_project(request): SampleInformationFormSet = formset_factory(SampleInformatio

请帮忙

我正在尝试更新一组由主窗体pk与主窗体(项目信息)相关的窗体集。create表单工作得很好,但是我发现实现更新版本非常困难

对于表单集,我无法理解的是另存为更新部分。主窗体正确更新数据库。表单集只是创建新记录,而不是更新现有记录。我不知道如何引用表单集

这是代码

view.py

@login_required
def edit_project(request):
    SampleInformationFormSet = formset_factory(SampleInformationForm, extra=1)
    DissolutionMethodsFormSet = formset_factory(DissolutionMethodsForm, extra=1)
   
    form = ProjectInformationForm(request.POST or None)
    si_formset = SampleInformationFormSet(request.POST or None, prefix='si')
    d_formset = DissolutionMethodsFormSet(request.POST or None, prefix='d')
    
    if request.method == 'POST':
        form = ProjectInformationForm(request.POST or None)
        si_formset = SampleInformationFormSet(request.POST or None, prefix='si')
        d_formset = DissolutionMethodsFormSet(request.POST or None, prefix='d')

        pi_pk = ''
        p = ''

        if form.is_valid():
            pi_pk = form.cleaned_data['hd']
            p = ProjectInformation.objects.get(pk=pi_pk)
            form = ProjectInformationForm(request.POST, instance=p)
            form.save()  # This form saves correctly

        for si_form in si_formset:
            si_form.save() # I do not know how to attach an instance to these formsets

        for d_form in d_formset:
            d_form.save()

        
            messages.success(request, 'Your project has been updated!')
            return redirect('edit_project')

        else:
            pass

        form = ProjectInformationForm(request.POST or None)
        si_formset = SampleInformationFormSet(request.POST or None, prefix='si')
        messages.warning(request, 'There was an error saving your form.')

    study_id_select = list(
        ProjectInformation.objects.values('dissolution_study_id', 'id').filter())

    context = {'form': form, 'si_formset': si_formset, 'd_formset': d_formset, 'study_id_select': study_id_select}
    return render(request, 'main/edit_project.html', context)
models.py我只想包括七个模型中的三个模型的一部分,以使它稍微短一点

class ProjectInformation(models.Model):
    username = models.ForeignKey(User, on_delete=models.CASCADE)
    compound_code = models.CharField(max_length=60)
    product_type = models.ForeignKey(ProductType, on_delete=models.CASCADE)
    main_component = models.CharField(max_length=100)

class SampleInformation(models.Model):
    sample_index = models.CharField(max_length=30)
    sample_type_purpose = models.ForeignKey(SampleTypePurpose, on_delete=models.CASCADE)
    specification_number = models.CharField(max_length=20, blank=True, null=True)
    project = models.ForeignKey(ProjectInformation, on_delete=models.CASCADE, blank=True, null=True)

class DissolutionMethods(models.Model):
    number_of_methods = models.IntegerField(default=1,
                                            validators=[MaxValueValidator(10), MinValueValidator(1)],
                                            blank=True, null=True)
    dissolution_method_index = models.CharField(max_length=10)
    project = models.ForeignKey(ProjectInformation, on_delete=models.CASCADE, blank=True, null=True)
forms.py

class ProjectInformationForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['hd'] = forms.CharField(widget=forms.HiddenInput, required=False)

    class Meta:
        model = ProjectInformation
        fields = '__all__'

class SampleInformationForm(forms.ModelForm):
    class Meta:
        model = SampleInformation
        fields = '__all__'


如果可以的话,请帮忙。这个项目已经被火试过了,火焰很热

最后我自己解决了

@login_required
def edit_project(request):
    SampleInformationFormSet = formset_factory(SampleInformationForm, extra=1)
    DissolutionMethodsFormSet = formset_factory(DissolutionMethodsForm, extra=1)
   
    form = ProjectInformationForm(request.POST or None)
    si_formset = SampleInformationFormSet(request.POST or None, prefix='si')
    d_formset = DissolutionMethodsFormSet(request.POST or None, prefix='d')
    
    if request.method == 'POST':
        form = ProjectInformationForm(request.POST or None)
        si_formset = SampleInformationFormSet(request.POST or None, prefix='si')
        d_formset = DissolutionMethodsFormSet(request.POST or None, prefix='d')

        pi_pk = ''
        p = ''

        if form.is_valid():
            pi_pk = form.cleaned_data['hd']
            p = ProjectInformation.objects.get(pk=pi_pk)
            form = ProjectInformationForm(request.POST, instance=p)
            form.save()

        si = p.sampleinformation_set.all()  # All the Methods related to the instance
        d = p.dissolutionmethods_set.all()

        si_cnt = 0
        for si_form in si_formset:
            if si_form.is_valid():
               update = si_form.save(commit=False)
               update.pk = si[si_cnt].pk
               update.save()
               si_cnt += 1

        d_cnt = 0
        for d_form in d_formset:
            if d_form.is_valid():
                update = d_form.save(commit=False)
                update.pk = d[d_cnt].pk
                update.save()
                d_cnt += 1

我认为如果你想更新它,你必须在表单集中传递一个对象的实例。请看这里:它没有解释如何使用表单集执行此操作。该文档仅显示如何保存简单表单,而不是从表单集工厂保存表单集。