Django Formset возвращает INAVLID несмотря на наличие действительных данных - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть набор форм Django, который предварительно заполняется моделью, а затем отображается на веб-странице. Веб-страница отображается как Django Отображение набора форм . Изменения вносятся в последнее поле, показанное на скриншоте. После отправки формы через POST и выдачи выписки (строка № 2 в методе post) опубликованные данные четко отображаются на консоли. (Вывод консоли показан ниже). Но оператор проверки правильности набора форм всегда возвращает FALSE. Код выглядит следующим образом:

------ Код -------

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()
    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')

class ApproveRejectEscalateForm(forms.ModelForm):
    def clean(self):
        self.cleaned_data = super(ApproveRejectEscalateForm, self).clean()
        return self.cleaned_data

    class Meta:
        model = LeaveTransactionLog
        fields = ['empno','applied_year','applied_date','approver_mgrno','leave_type', 'leave_start_date', 'leave_end_date', 'leave_days','leave_decision']

class ApproveRejectEscalateFormView(View):
    def get(self,request):
        ARE_formset = modelformset_factory(LeaveTransactionLog, fields=(
            'empno','applied_year','applied_date','approver_mgrno','leave_type', 'leave_start_date', 'leave_end_date', 'leave_days',
            'leave_decision'), max_num=2, min_num=0)
        formset = ARE_formset(initial=model_to_dict(LeaveTransactionLog))
        return render(request,'ApproveRejectEscalateForm.html',{'formset':formset})

    def post(self,request):
        responseformset = ApproveRejectEscalateForm(request.POST,initial= model_to_dict(LeaveTransactionLog))
        print('Data : ',responseformset.data)
        counter = 0
        for forms in responseformset:
            if forms.form.is_valid():
                print('Valid.. !')
                counter = counter + 1
            else:
                print('Invalid form #',counter)
                print(forms.errors.as_data())
                print(forms.data)
                counter = counter + 1

        print('Counter : ',counter)
        if responseformset.is_valid():
           print('Formset 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('Formset Invalid !')
            print(responseformset.errors)
            print(responseformset.non_field_errors())
        #return render(request, 'LeaveApplicationhome.html')
        return render(request, 'ApproveRejectEscalateForm.html',{'formset':responseformset})

----- Код --------

Также, когда формы в наборе повторяются, итерация производит 8 проходов, несмотря на то, что форма имеет только 2 формы, как показано на скриншоте. Вот вывод с консоли. Ошибки формы не говорят, какое поле является обязательным. Набор форм возвращается полностью пустым с 9 строками в таблице, как показано здесь. Пустая форма установлена ​​после публикации

Вывод на консоль:

Отслеживание изменений файла с помощью StatReloader Выполнение системных проверок ...

Проверка системы определена нет проблем (0 заставили замолчать). 06 февраля 2020 - 07:47:43 Django версия 3.0, с использованием настроек 'las.settings' Запуск сервера разработки на http://127.0.0.1: 8000 / Выйти из сервера с помощью CTRL-BREAK.

[06 / Feb / 2020 07:47:49] "GET / ApproveRejectEscalateForm / HTTP / 1.1" 200 9393

['386yERIzKid9aKY4yHLyjZIcw36LkIUcHV l2VVFAMPZU1 : ['2'], 'form-INITIAL_FORMS': ['2'], 'form-MIN_NUM_FORMS': ['0'], 'form-MAX_NUM_FORMS': ['2'], 'form-0-empn o ': [' 1 '],' form-0-оставить_тип ': [' PL '],' form-0-оставить_старт_date ': [' 2020-01-29 '],' form-0-оставьте_end_date ': [' 2020-01-30 '],' form-0-листья_дней ': [' 1 '],' form-0- apply_date ': [' 2020-01-28 16:24:07 '],' форма-0- Approver_mgrno ': [' 7902 '],' form -0-left_decision ': [' ES '],' form-1-empno ': [' 2 '],' form-1-left_type ': [' PL '] , 'form-1-left_start_date': ['2020-02-04'], 'form-1-exit_end_date': ['2020-02-05'], 'form-1-листьями_days': ['1'] , 'form-1-apply_date': ['2020-02-03 14:06:18'], 'form-1-Approver_mgrno': ['7698'], ' form-1-left_decision ': [' ES ']}>

Неверная форма # 0 [ValidationError ([' Это поле обязательно для заполнения. '])] Нет Нет Неверная форма # 1 [ValidationError ([ 'Это поле обязательно для заполнения.'])] Нет. Недопустимая форма # 2 [ValidationError (['Это поле обязательно для заполнения.'])] Нет. Недопустимая форма # 3 [ValidationError (['Это поле обязательно для заполнения.'])] Нет. форма # 4 [ValidationError (['Это поле обязательно для заполнения.'])] Нет Недопустимая форма # 5 [ValidationError (['Это поле обязательно для заполнения.'])] Нет Нет Неверная форма # 6 [ValidationError (['Это поле обязательно для заполнения . '])] Нет Недопустимая форма # 7 [ValidationError ([' Это поле обязательно для заполнения. '])] Нет Недопустимая форма # 8 [ValidationError ([' Это поле обязательно для заполнения. '])] Нет Счетчик: 9 Formset Invalid!

empno Это поле обязательно для заполнения. apply_year Это поле обязательно для заполнения. apply_date Это поле обязательно для заполнения. Approver_mgrno Это поле обязательно для заполнения. D. тип_воли Это поле обязательно для заполнения. листьями_старт_даты Это поле является обязательным для заполнения. листьями_данных_дата Это поле необходимо заполнить. листьями_дней Это поле обязательно для заполнения. листья_разрешения Это поле обязательно для заполнения.
...