2011-11-17 32 views
2

一個formset我見過this職位和(因爲它是過時的部分),它不工作。我也研究了源碼樹無濟於事(測試幫助),但我找不到我的答案。我正在做的是在form0('start')中獲取一組種子數據,這將動態地爲step2構建一個formset。步驟2只是一個驗證步驟。Django的FormWizard - 你如何動態地創建基於前面的步驟

  1. '開始' - 用戶輸入細分(SUBA)郵政編碼(12345)和手(51,52,53)
  2. '步驟2' 一個csv - 甲動態形式(modelformset)與3中創建代表51,52,53
  3. 用戶點擊的形式去和模型建立

data = [ { 'subdivision': <subA>, 'zipcode': '12345', 'lot_number': '51'} 
     { 'subdivision': <subA>, 'zipcode': '12345', 'lot_number': '52'} 
     { 'subdivision': <subA>, 'zipcode': '12345', 'lot_number': '53'} ] 

我已經試過

當執行解決方案here我只得到data=None。這是過時的,翻翻來源我認爲「正確」的方式做,這是簡單地覆蓋get_form_instance方法和餵養它get_cleaned_data_for_step,但似乎重新驗證並做很多更多的東西比我想這需要(並沒有工作)。

所以..我要找的是兩件事情。

  1. 什麼是正確的方式來獲得以前的表格數據。
  2. 如何獲取該數據並使用它創建n個表單集。

FWIW我使用Django 1.4-α表單集嚮導。

這是我的。

# urls.py 
    url(r'homes/bulk/$', TestWizard.as_view([('start', BulkHomeForm0), 
              ('step2', HomeFormSet)])), 

# Models.py 
class Subdivision(models.Model): 
    name = models.CharField(max_length=64) 

class Home(models.Model): 
    lot_number = models.CharField(max_length=16) 
    subdivision = models.ForeignKey(Subdivision) 
    zipcode = models.IntegerField(validators=[validate_zipcode], null=True) 

# Forms 
class BulkHomeForm0(forms.Form): 
    subdivision = forms.ModelChoiceField(queryset=Subdivision.objects.all(), required=True) 
    zipcode = USZipCodeField(required=True) 
    lots = forms.CharField(max_length=5000, widget=forms.Textarea() 

    def clean(self): 
     subdivision = self.cleaned_data.get('subdivision', False) 
     zipcode = self.cleaned_data.get('zipcode', False) 
     final_data = [] 
     for item in self.cleaned_data.get('lots', "").split(",") 
      final_data.append({'subdivision':subdivision, 
           'zipcode':zipcode, 
           'lot_number':item}) 
     self.cleaned_data['homes'] = final_data 

class BulkHomeForm1(forms.ModelForm): 
    class Meta: 
     model = Home 

HomeFormSet = modelformset_factory(Home, form=BulkHomeForm1, extra=2) 

# Views.py 
class TestWizard(WizardView): 
    storage_name = 'django.contrib.formtools.wizard.storage.session.SessionStorage' 

    def get_form(self, step=None, data=None, files=None): 
     form = super(TestWizard, self).get_form(step=step, data=data, files=files) 
     return form 

    def done(self, form_list, **kwargs): 
     return render_to_response('done.html', { 
      'form_data': [form.cleaned_data for form in form_list], 
     }) 

回答

3

這裏是我想出了..

我似乎無法得到的ModelForm很好地工作,所以我保留了兩個獨立和它們合併爲done。這是不是很完美,但它越來越近..

class BulkHomeForm1(forms.Form): 

    lot_number = forms.CharField(max_length=16, required=True) 
    street_line1 = forms.CharField(max_length=100, required=True) 
    floorplan = forms.ModelChoiceField(queryset=Floorplan.objects.filter(is_active=True), required=False) 
    start_date = forms.DateField(required=False) 

temp_storage_location = tempfile.mkdtemp(dir=settings.MEDIA_ROOT, prefix="bulk_homes_") 
os.chmod(temp_storage_location, 02775) # TODO FIX ME 
temp_storage = FileSystemStorage(location=temp_storage_location) 

class BulkHomeWizard(SessionWizardView): 
    file_storage = temp_storage 

    def get_form(self, step=None, data=None, files=None): 

     form = super(BulkHomeWizard, self).get_form(step=step, data=data, files=files) 
     if self.steps.current == 'start' and form.prefix != "step2": 
      # Limit the subdivisions down to the specifics 
      sub_qs = Subdivision.objects.filter(is_active=True) 
      if self.request.user.company_type == "rater": 
       sub_qs = sub_qs.filter(rater_orgs=self.request.user.company.id) 
      elif self.request.user.company_type == "eep": 
       sub_qs = sub_qs.filter(eep_orgs=self.request.user.company.id) 
      form.fields['subdivision'].queryset = sub_qs 
     return form 

    def get_context_data(self, form, **kwargs): 
     context = super(BulkHomeWizard, self).get_context_data(form, **kwargs) 
     self.template_name = 'axis/bulk_%s.html' % self.steps.current 
     return context 

    def get_form_initial(self, step): 
     """This is used to seed the model set with information from the previous step""" 
     if step == 'step2': 
      log.info("Into Step 2") 
      data = self.get_cleaned_data_for_step('start')['homes'] 
      return data 
     return self.initial_dict.get(step, {}) 

    def done(self, form_list, **kwargs): 

     cleaned_data = [form.cleaned_data for form in form_list] 

     subdivision = cleaned_data[0].get('subdivision') 
     city = subdivision.city 
     state = subdivision.state 
     zipcode = cleaned_data[0].get('zipcode') 

     for form in cleaned_data[1]: 
      data = Home.objects.get_or_create(lot_number = form.get('lot_number'), 
               floorplan = form.get('floorplan', None), 
               street_line1 = form.get('street_line1', None), 
               subdivision = subdivision, 
               city = subdivision.city, state=subdivision.state, 
               zipcode=zipcode, 
               start_date = form.get('start_date', None),) 
      obj, created = data 
      obj.clean() 
      obj.save() 
      if created: 
       log.info("Create new Home") 

     return HttpResponseRedirect(reverse("subdivision_view", kwargs={'subdivision_id': subdivision.id})) 
相關問題