Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么我的表单生成KeyError而不是从表单中引发ValidationError?_Python_Django_Keyerror - Fatal编程技术网

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

Python 为什么我的表单生成KeyError而不是从表单中引发ValidationError?,python,django,keyerror,Python,Django,Keyerror,我有一个表单,它有三个必填的主要字段。这些字段是外键字段。第二个和第三个是下拉列表,第三个是依赖于第二个字段数据的下拉列表。当我提交完整填写的表格时,它就起作用了。如果我提交第一个和第二个字段,第三个字段为空,当它应该选择某些内容时,它确实会引发ValidationError,但是当我提交表单时,仅填写第一个字段,它会创建此错误,而不是引发ValidationError KeyError at /operations/enter-exit-area/ 'work_area' Request Me

我有一个表单,它有三个必填的主要字段。这些字段是外键字段。第二个和第三个是下拉列表,第三个是依赖于第二个字段数据的下拉列表。当我提交完整填写的表格时,它就起作用了。如果我提交第一个和第二个字段,第三个字段为空,当它应该选择某些内容时,它确实会引发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
型号.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)
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")
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
    })
forms.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)
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")
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
    })
型号.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)
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")
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
    })

因为
cleaned_data
不包含名为
work_area
的键,所以我尝试从clean()函数中进行检查,但当我在调试器中运行时,它甚至无法访问它。我只是在form.is_valid()
area=cleaned_data['work_area']
→ <代码>区域=已清理的数据。获取(“工作区域”)