为什么我的表单会生成KeyError而不是从表单引发ValidationError?

时间:2019-12-16 17:35:57

标签: python django keyerror

我有一个表单,其中包含三个必填字段。这些字段是ForeignKey字段。第二个和第三个是下拉菜单,第三个是依赖于第二个字段数据的下拉菜单。当我提交完全填写的表格时,它可以工作。如果我提交第一个和第二个字段,而第三个为空,则应该选择某些内容时,它会引发ValidationError,但是当我提交仅填写了第一个字段的表单时,它会产生此错误,而不是引发ValidationError

KeyError at /operations/enter-exit-area/
'work_area'
Request Method: POST
Request URL:    http://localhost:8000/operations/enter-exit-area/
Django Version: 2.1.5
Exception Type: KeyError
Exception Value:    
'work_area'
Exception Location: operations\forms.py in clean, line 23

models.py

class WorkArea(models.Model):
    name = models.CharField(max_length=50)

    def __str__(self):
        return self.name


class Station(models.Model):
    work_area = models.ForeignKey(WorkArea, on_delete=models.CASCADE, related_name="stations")
    name = models.CharField(max_length=50)

    def __str__(self):
        return self.name


class EmployeeWorkAreaLog(TimeStampedAuthModel, SoftDeleteModel, models.Model):
    employee_number = models.ForeignKey(Salesman, on_delete=models.SET_NULL, help_text="Employee #", null=True, blank=False)
    work_area = models.ForeignKey(WorkArea, on_delete=models.SET_NULL, null=True, blank=False, help_text="Work Area", related_name="work_area")
    station_number = models.ForeignKey(Station, on_delete=models.SET_NULL, null=True, help_text="Station", related_name="stations", blank=True)

forms.py

class WarehouseForm(AppsModelForm):
    class Meta:
        model = EmployeeWorkAreaLog
        widgets = {
            'employee_number': ForeignKeyRawIdWidget(EmployeeWorkAreaLog._meta.get_field('employee_number').remote_field, site, attrs={'id':'employee_number_field'}),
        }
        fields = ('employee_number', 'work_area', 'station_number', 'modified_in', 'modified_out')

    def clean(self):
        cleaned_data = super().clean()
        emp_num = cleaned_data['employee_number']
        area = cleaned_data['work_area']
        station = cleaned_data['station_number']

        if area is None:
            raise forms.ValidationError("You must select a work area")
        if Station.objects.filter(work_area=area).exists() and station is None:
            raise forms.ValidationError("You must select a station")

models.py

def enter_exit_area(request):
    message = ''
    disable_enter = False
    disable_exit = False

    if request.method == 'POST':
        form = WarehouseForm(request.POST)

        if form.is_valid():
            emp_num = form.cleaned_data['employee_number']
            area = form.cleaned_data['work_area']
            station = form.cleaned_data['station_number']

            if 'enter_area' in request.POST:
                # Logic ..

    else:
        form = WarehouseForm()

    return render(request, "operations/enter_exit_area.html", {
        'form': form,
        'disable_enter': disable_enter,
        'disable_exit': disable_exit
    })

0 个答案:

没有答案