2017-01-31 5 views
0

InLineFormSet을 사용하여 특정 작업 표와 관련된 모든 레코드를 표시했습니다. 사용자는 페이지에 많은 새로운 양식을 추가 할 수 있습니다. 아약스와 html을 사용하여 아래쪽의 빈 existing_form에 새 ID를 추가했습니다. 그러나 이것을 저장하는 것은 문제입니다. 새로 추가 된 양식에는 timesheet_id가 아직 할당되지 않았기 때문에 existing_forms의 일부로 저장하지 않습니다.InLineFormSet에 init 메서드 추가

폼을 생성 할 때 init 메서드를 함께 사용하여이 문제를 해결하려고합니다. (?)

1) 레코드가 existing_formset의 일부가되기 전에 레코드를 저장해야합니까?

2) TimeForm_id를 TimeForm에서 제외했습니다 .... 이것은 form.timesheet_id = var가 작동하지 않는다는 것을 의미하며 ... obj.timesheet_id를 사용해야합니다 ...하지만이 작업을 수행 할 수 있습니까? 폼의 초기화에서 ?? 매우 혼란.

3) ..... 쉽게 새로 추가 된 형태와 사용 modelformset_factory에 대한 새의 formset을 사용할 수 있나요

보기 : 나는 두 개의 별도의 formsets에서를 사용하여이 접근 한

class CustomInlineFormSet(BaseInlineFormSet): 
    def clean(self): 
     super(CustomInlineFormSet, self).clean() 
     timesheet = TimeSheet.objects.get(pk=timesheet_id) 
     for form in self.forms: 
      form.empty_permitted = True 
    def __init__(self, request, *args, **kwargs): 
     super(CustomInlineFormSet, self).__init__(*args,**kwargs) 
     # the following won't work because it's excluded from the form? 
     # self.fields['timesheet_id'] = forms....... oh no 
     timesheet_fromview = request.session.get('timesheet') 
     print timesheet_fromview 
     for form in self.forms: 
      obj = form.save(commit=False) 
      obj.timesheet_id = timesheet_fromview 

     try: 
      del request.session['timesheet'] 
      print "session deleted" 
     except KeyError: 
      pass 
      print "Key error raised" 



def timesheet(request, timesheet_id): 
    timesheet = TimeSheet.objects.get(pk=timesheet_id) 

    TimeInlineFormSet = inlineformset_factory(TimeSheet, Time, exclude=('timesheet_id',), extra=0, formset=CustomInlineFormSet) 

    if request.method == 'POST': 
     # instance is not yet timesheet.... no foreign key in new fields so doesn't do anything 
     existing_formset = TimeInlineFormSet(request.POST, request.FILES, instance=timesheet) 

     for thetime in existing_formset.forms: 
      # obj = thetime.save(commit=False) 
      # obj.timesheet_id = timesheet 
      # obj.save() 
      # print obj 
      if thetime.is_valid(): 
       print "existing time is valid" 
       thetime.save() 
      else: 
       "existing time is not valid" 

     context = { 
      "timesheet": timesheet, 
      "existing_formset": existing_formset, 
     }  
     return render(request, 'tande/timesheet.html', context) 
    else: 
     print "method is not post" 
     existing_formset = TimeInlineFormSet(instance=timesheet) 
     new_timeformset = NewTimeFormSet() 
     request.session['timesheet'] = timesheet 
     context = { 
      "timesheet": timesheet, 
      "existing_formset": existing_formset, 
     }  
     return render(request, 'tande/timesheet.html', context) 

답변

0

내 견해, 기존 기록을위한 인라인과 새로운 추가를위한 하나의 모델 형식.

def timesheet(request, timesheet_id): 
    timesheet = TimeSheet.objects.get(pk=timesheet_id) 

    TimeInlineFormSet = inlineformset_factory(TimeSheet, Time, exclude=('timesheet_id',), extra=0, formset=CustomInlineFormSet) 
    NewTimeFormSet = modelformset_factory(Time, form=TimeForm, formset=RequiredFormSet) 

    if request.method == 'POST': 
     existing_formset = TimeInlineFormSet(request.POST, request.FILES, instance=timesheet) 
     newtime_formset = NewTimeFormSet(request.POST, request.FILES) 

     for orange in newtime_formset: 
      obj = orange.save(commit=False) 
      if obj.add_row == "True": 
       obj.timesheet_id = timesheet 
       obj.add_row = "False" 
       obj.save() 

     for thetime in existing_formset.forms: 
      if thetime.is_valid(): 
       thetime.save() 

     existing_formset = TimeInlineFormSet(instance=timesheet) 
     newtime_formset = NewTimeFormSet() 
     context = { 
      "timesheet": timesheet, 
      "existing_formset": existing_formset, 
      "newtime_formset": newtime_formset, 
     }  
     return render(request, 'tande/timesheet.html', context) 
:

class Time(models.Model): 
    project_id = models.ForeignKey(Project, null=True) 
    date_worked = models.DateField(null=True, blank=True) 
    hours = models.CharField(max_length=1) 
    description = models.CharField(max_length=150) 
    timesheet_id = models.ForeignKey(TimeSheet, null=True) 
    add_row = models.CharField(max_length=10, default=True, editable=False) 
    def __unicode__ (self): 
     return self.description 

뷰는 별도로이 formsets 저장 : 레코드가 거짓 새로 추가하고, 때 기존의 formset에있을 때 나는 그 사실이다 필드와 별도로 두 개의 저장