【问题标题】:Class Based Generic UpdateView inline基于类的通用 UpdateView 内联
【发布时间】:2012-01-30 20:44:58
【问题描述】:

我有以下型号

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))

我想做的是一个 UpdateView,所以我复制了 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_data 中的 PositionFormSet(self.request.POST) 出现“列表索引超出范围”错误。有没有其他人遇到过这个问题?

【问题讨论】:

标签: django django-forms django-views


【解决方案1】:

在 EditCvView 中:

context['position_form'] = PositionFormSet(self.request.POST, instance=self.object)

【讨论】:

  • 我放弃了表单集,我像这样创建我的并且只需要 5 个项目:PurchaserChoiceFormset = inlineformset_factory(Worksheet, PurchaserChoice, form=PurchaserChoiceForm, can_delete=False, extra=5, max_num=5)创建第 5 个项目并重新保存表单后,它会创建一个新的额外购买选择项目!我的保存代码是: if context['choice_formset'].is_valid(): context['choice_formset'].instance = context['worksheet'] context['choice_formset'].save()
猜你喜欢
  • 2015-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-15
  • 2011-09-05
  • 1970-01-01
  • 2012-06-17
  • 1970-01-01
相关资源
最近更新 更多