2011-11-17 3 views
2

나는 this 게시물을 보았으며 작동하지 않습니다 (부분적으로 날짜가 있기 때문에). 나는 또한 소스 트리를 무용지물로 시험했는데 (테스트가 도움이되었지만) 내 대답을 찾을 수 없다. 내가 뭘 찾고있는 동적으로 step2에 대한 formset을 빌드 form0 ('시작')에서 데이터의 씨앗 집합을 얻을 수 있습니다. 2 단계는 단순히 검증 단계입니다.Django FormWizard - 이전 단계를 기반으로 formset을 동적으로 생성하는 방법

  1. '시작'- (modelformset)가 3 생성되는 동적 형태 - 사용자가 호 (SUBA), 우편 번호 (12345)와 로트 (51,52,53)
  2. '단계 2'의 CSV 입사 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_cleaned_data_for_step 먹이를 재현하고 할 것 같습니다 많이 내가 생각하는 것보다 더 많은 것들이 (그리고 그것은 작동하지 않았다).

그래서 .. 내가 찾고있는 것은 두 가지입니다.

  1. 이전 양식 데이터를 얻는 올바른 방법은 무엇입니까?
  2. 데이터를 가져 와서 n 개의 양식 세트를 만드는 데 어떻게 사용합니까?

FWIW Django 1.4-alpha formset 마법사를 사용하고 있습니다.

다음은 내가 가지고있는 것입니다. 여기

# 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

그래서 나는 두 개의 별도 보관하고 done에 그들을 합병 나는이 modelForm 멋지게 일을 얻을 수가 없습니다 ..

해낸 것입니다. 아직 완벽하지는 않지만 가까워지고 있습니다.

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})) 
관련 문제