Django内联表单集,一旦所有内联线都已满,表单将创建一个额外的条目并将其保存到db

Django内联表单集,一旦所有内联线都已满,表单将创建一个额外的条目并将其保存到db,django,django-models,django-forms,Django,Django Models,Django Forms,这是我的密码 views.py: from django.views.generic import TemplateView, View, UpdateView from django.contrib.auth.decorators import login_required from django.shortcuts import redirect from django.core.urlresolvers import reverse PurchaserChoiceFormset = in

这是我的密码

views.py:

from django.views.generic import TemplateView, View, UpdateView
from django.contrib.auth.decorators import login_required
from django.shortcuts import redirect
from django.core.urlresolvers import reverse

PurchaserChoiceFormset = inlineformset_factory(Worksheet, PurchaserChoice, form=PurchaserChoiceForm, can_delete=False,extra=5, max_num=5)

from models import Worksheet 
from forms import PurchaserChoiceFormset

class WorksheetStep1View(TemplateView):

    template_name = 'worksheets/step1.html'

    def get_context_data(self, **kwargs):  # Exec 1st

        context = super(WorksheetStep1View, self).get_context_data(**kwargs)

        context['worksheet'] = Worksheet.objects.get(pk=self.kwargs.get('worksheet_id'))

        context['choice_formset'] = PurchaserChoiceFormset(self.request.POST or None, instance=context['worksheet'])

        return context


    def post(self, request, *args, **kwargs):
        context = self.get_context_data()

        if context['choice_formset'].is_valid():
            context['choice_formset'].instance = context['worksheet']
            context['choice_formset'].save()

        return super(WorksheetStep1View, self).render_to_response(context)
models.py:

from django.db import models

class Worksheet(models.Model):
    completed_date = models.DateTimeField(null=True, blank=True) 

class PurchaserChoice(models.Model):  # Choice made by the purchaser for model/floor

    model = models.CharField(blank=True, null=True, max_length=255)
    floor = models.CharField(blank=True, null=True, max_length=255)  # coming from API
    worksheet = models.ForeignKey('worksheets.Worksheet')

    def __unicode__(self):
        return "PurchaseChoiceID {0}, WorksheetID {1} - Model: {2} - Floor: {3}".format(self.id, self.worksheet.id,
                                                                                        self.model, self.floor, )

    class Meta:
        #ordering = ('-model', 'floor')
        ordering = ('-id', )
我希望最多只存在5个purchase选项实例,但在表单已满并再次保存后,将创建一个新条目。如果我去掉context['choice_formset'].instance=context['sheet'],更糟糕的是,它会为表单集中的每个实例创建一个新条目

有人能帮我弄清楚为什么会这样吗?我也看了UpdateView,但它似乎有比我需要的更多的东西,我不认为这是我的问题的原因。我不知道为什么它会创建新条目,而不是在表单中有5个条目并再次保存后更新

避免此问题的一种方法是每次删除“保存”上的所有选项,如下所示:

def post(self, request, *args, **kwargs):
    context = self.get_context_data()
    if context['choice_formset'].is_valid():
        PurchaserChoice.objects.filter(worksheet=context['worksheet']).delete()
        #context['choice_formset'].instance = context['worksheet']
        context['choice_formset'].save()

    return super(WorksheetStep1View, self).render_to_response(context)

因此,我发现错误的是,我返回了错误的带有上下文的父类的render_to_响应,这导致我每次都创建新对象,因为实例丢失了。这就是修复它的方法:

return self.render_to_response(context)
而不是:

return super(WorksheetStep1View, self).render_to_response(context)
这也不起作用:

return TemplateResponse(request, self.template_name, context)
我会看看我是否能更好地理解为什么TemplateResponse不起作用