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)