2017-01-31 10 views
0

InLineFormSetを使用して、特定のタイムシートに関連するすべてのレコードを表示しました。ユーザーはページに多くの新しいフォームを追加できます。私はajaxとhtmlを使用して、新しいIDで下部に空のexisting_formを追加しました。ただし、これを保存することは問題です....新しく追加されたフォームにはtimesheet_idがまだ割り当てられていないため、existing_formsの一部として保存されません。InLineFormSetにinitメソッドを実装する

フォームを作成するときにinitメソッドを一緒に配置しようとしていますが、うまくいけばこの問題を解決できます。 (?)

1)レコードをexisting_formsetの一部にする前に、レコードを保存する必要がありますか?

2)タイムフォームからtimesheet_idを除外しました....これはform.timesheet_id = varが動作しないと仮定していることを意味し、obj.timesheet_idを使用する必要があります。フォームの初期化で??非常に混乱。

3)それが簡単に新しく追加されたフォームの新しいフォームセットを使用してmodelformset_factoryを使用することです.....

ビュー:

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

私は二つの別々のフォームセットを使用してこれを近づいてきました私の意見は、既存のレコードのための1つのインラインと、新しい追加のための1つのモデルのフォームセットです。それは、既存のフォームセットであるとき、私はその後、レコードが新たに追加されたときにTrueの場で個別に2を保存して、偽:

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 

を見るには別途2つのフォームセットを保存します。

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) 
関連する問題