Django内联表单集,一旦所有内联线都已满,表单将创建一个额外的条目并将其保存到db
这是我的密码 views.py: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
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不起作用