Models.py
class LeaveTransactionLog(models.Model):
empno = models.ForeignKey(Employee,related_name='ltl_empno',on_delete=models.PROTECT)
approver_mgrno = models.IntegerField(default=0)
applied_year = models.IntegerField(default=2019)
applied_date = models.DateTimeField(auto_now_add=True)
leave_type = models.CharField(max_length=2,choices=leave_choices,default='PL')
leave_start_date = models.DateField()
leave_end_date = models.DateField()
leave_days = models.IntegerField(default=0)
leave_decision = models.CharField(max_length=2,choices=decision_choices,default='ES')
forms.py
class ApproveRejectEscalateForm(forms.ModelForm):
# this method is implicitly called when form validation occurs on use of form.is_valid() call.
# can also be used to transform values received on form before a save is fired to DB.
def clean(self):
self.cleaned_data = super(ApproveRejectEscalateForm, self).clean()
return self.cleaned_data
class Meta:
model = LeaveTransactionLog
fields =['empno','approver_mgrno','applied_year','leave_type','leave_start_date','leave_end_date','leave_days','leave_decision']
Views.py
class ApproveRejectEscalateFormView(View):
def get(self, request):
ARE_formset = modelformset_factory(LeaveTransactionLog, fields=(
'empno', 'approver_mgrno', 'applied_year', 'leave_type', 'leave_start_date', 'leave_end_date',
'leave_days',
'leave_decision'),max_num=2,min_num=0,form=ApproveRejectEscalateForm)
formset = ARE_formset()
return render(request,'ApproveRejectEscalateForm.html',{'formset':formset})
def post(self,request):
qset = LeaveTransactionLog.objects.all().values()
print(qset)
responseformset = ApproveRejectEscalateForm(request.POST,initial=qset)
if responseformset.is_valid():
print('Form valid !')
formdata = responseformset.cleaned_data
iteration = 1
for f in responseformset:
print('Employee details :',iteration)
print('Employee number :',formdata.empno)
iteration = iteration + 1
else:
print('Form Invalid !')
print(responseformset.errors)
print(responseformset.non_field_errors())
return render(request, 'LeaveApplicationhome.html')
Следующие две строки являются источником ошибки. .
qset = LeaveTransactionLog.objects.all().values()
responseformset = ApproveRejectEscalateForm(request.POST,initial=qset)
Если я использую набор запросов после извлечения значений и затем передаю его начальному параметру набора форм, то ошибка говорит - dictionary update sequence element #0 has length 10; 2 is required
Если я использую набор запросов без вызова values () сообщение об ошибке выдает: cannot convert dictionary update sequence element #0 to a sequence
Вот как показывает набор запросов при выводе на консоль, которая выглядит как правильные пары ключ-значение:
initial =
<QuerySet [{'id': 28, 'empno_id': 1, 'approver_mgrno': 7902, 'applied_year': 2019, 'applied_date': datetime.datetime(2020, 1, 28, 16, 24, 7, 7510, tzinfo=<UTC>), 'leave_type': 'PL', 'leave_start_date':
datetime.date(2020, 1, 29), 'leave_end_date': datetime.date(2020, 1, 30), 'leave_days': 1, 'leave_decision': 'ES'}, {'id': 29, 'empno_id': 2, 'approver_mgrno': 7698, 'applied_year': 2019, 'applied_date': datetime.datetime(2020, 2, 3, 14, 6, 18, 691208, tzinfo=<UTC>), 'leave_type': 'PL', 'leave_start_date': datetime.date(2020, 2, 4), 'leave_end_date': datetime.date(2020, 2, 5), 'leave_days': 1, 'leave_decision': 'ES'}]>
Как правильно передать начальные значения при вызове request.POST? Мне нужно получить значения, размещенные в наборе форм модели, созданной с помощью модели LeaveTransactionLog.