Django 基于类的泛型UpdateView内联
我有以下型号Django 基于类的泛型UpdateView内联,django,django-forms,django-views,Django,Django Forms,Django Views,我有以下型号 class Cv(models.Model): name = models.CharField(_('name'), max_length=250) objective = models.CharField(_('objective'), max_length=250) slug = models.SlugField(editable=False) class Position(models.Model): cv = models.ForeignK
class Cv(models.Model):
name = models.CharField(_('name'), max_length=250)
objective = models.CharField(_('objective'), max_length=250)
slug = models.SlugField(editable=False)
class Position(models.Model):
cv = models.ForeignKey(Cv, verbose_name=_('cv'))
start = models.DateField(_('start'))
end = models.DateField(_('end'))
name = models.CharField(_('name'), max_length=250)
currently_employed = models.BooleanField(_('currently employed'))
sector = models.IntegerField(_('sector'), choices=SECTOR_CHOICES)
duties = models.TextField(_('duties'))
及下列表格:
class CvForm(ModelForm):
class Meta:
model = Cv
class PositionForm(ModelForm):
class Meta:
model = Position
widgets = {
'start': DateInput(attrs={'class':'datepicker'}),
'end': DateInput(attrs={'class':'datepicker'}),
}
PositionFormSet = inlineformset_factory(Cv, Position, form=PositionForm, extra=1)
我创建了以下通用CreateView,效果非常好:
class CreateCvView(CreateView):
model = Cv
form_class = CvForm
template_name = 'recruitment/cv/cv_detail.html'
def get_success_url(self):
self.success_url = '/'
return self.success_url
def get_context_data(self, **kwargs):
context = super(CreateCvView, self).get_context_data(**kwargs)
if self.request.POST:
context['position_form'] = PositionFormSet(self.request.POST)
else:
context['position_form'] = PositionFormSet(instance=self.object)
return context
def form_valid(self, form):
self.object = form.save(commit=False)
self.object.slug = slugify(self.request.user)
context = self.get_context_data()
position_form = context['position_form']
if position_form.is_valid():
self.object = form.save()
position_form.instance = self.object
position_form.save()
return HttpResponseRedirect(self.get_success_url())
else:
return self.render_to_response(self.get_context_data(form=form))
我想做的是更新视图,因此我复制了createview并将slug传递给它,如下所示:
class EditCvView(UpdateView):
model = Cv
form_class = CvForm
template_name = 'recruitment/cv/cv_detail.html'
def get_success_url(self):
self.success_url = '/'
return self.success_url
def get_context_data(self, **kwargs):
context = super(EditCvView, self).get_context_data(**kwargs)
if self.request.POST:
context['position_form'] = PositionFormSet(self.request.POST)
else:
context['position_form'] = PositionFormSet(instance=self.object)
return context
def form_valid(self, form):
self.object = form.save(commit=False)
self.object.slug = slugify(self.request.user)
context = self.get_context_data()
position_form = context['position_form']
if position_form.is_valid():
self.object = form.save()
position_form.instance = self.object
position_form.save()
return HttpResponseRedirect(self.get_success_url())
else:
return self.render_to_response(self.get_context_data(form=form))
它可以很好地加载表单,但是当我发布表单时,在get_context_数据中的PositionFormSet(self.request.post)上会出现“列表索引超出范围”错误。还有其他人有此问题吗?在EditCvView中:
上下文['position\u form']=PositionFormSet(self.request.POST,instance=self.object)在EditCvView中:
context['position\u form']=PositionFormSet(self.request.POST,instance=self.object)谢谢!!无论如何,我发现这几乎做了所有的事情,所以我使用内联的创建和更新视图。谢谢!!无论如何,我发现这个几乎可以做所有事情,所以我使用了这个的内联创建和更新视图。我放弃了表单集,我像这样创建我的表单集,只需要5项:PurchaserChoiceFormset=inlineformset\u工厂(工作表,PurchaserChoice,form=PurchaserChoiceForm,can_delete=False,extra=5,max_num=5)创建第五个项目并重新保存表单后,它将创建一个新的额外购买选择项目!我的保存代码是:if context['Choice\u formset']。是否有效():context['Choice\u formset'].instance=context['sheet']context['choice\u formset'].save()我放弃了表单集,我这样创建了我的表单集,只需要5项:PurchaserChoiceFormset=inlineformset\u工厂(工作表,PurchaserChoice,form=PurchaserChoiceForm,can\u delete=False,extra=5,max\u num=5)创建第5个项目并重新保存表单后,它将创建一个新的额外购买选择项目!我的保存代码是:if context['Choice\u formset'].is\u valid():context['Choice\u formset'].instance=context['sheet']context['Choice\u formset'].save()