2012-01-30 64 views
2

我有以下型號類基於通用的UpdateView直列

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)錯誤。有沒有其他人有這個問題?

+1

你能發佈回溯? – darren 2012-01-30 21:33:47

+0

謝謝! Nevermind我發現這個https://github.com/AndrewIngram/django-extra-views幾乎所有事情都做了,所以我使用內聯創建和更新視圖。 – Crazyconoli 2012-01-31 00:12:20

回答

0

在EditCvView:

背景[ 'position_form'] = PositionFormSet(self.request.POST,例如= self.object)

+0

我放棄了formset,我創建了這樣的礦,只需要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() – radtek 2014-08-29 23:06:46