Python 为什么我的表单生成KeyError而不是从表单中引发ValidationError?
我有一个表单,它有三个必填的主要字段。这些字段是外键字段。第二个和第三个是下拉列表,第三个是依赖于第二个字段数据的下拉列表。当我提交完整填写的表格时,它就起作用了。如果我提交第一个和第二个字段,第三个字段为空,当它应该选择某些内容时,它确实会引发ValidationError,但是当我提交表单时,仅填写第一个字段,它会创建此错误,而不是引发ValidationErrorPython 为什么我的表单生成KeyError而不是从表单中引发ValidationError?,python,django,keyerror,Python,Django,Keyerror,我有一个表单,它有三个必填的主要字段。这些字段是外键字段。第二个和第三个是下拉列表,第三个是依赖于第二个字段数据的下拉列表。当我提交完整填写的表格时,它就起作用了。如果我提交第一个和第二个字段,第三个字段为空,当它应该选择某些内容时,它确实会引发ValidationError,但是当我提交表单时,仅填写第一个字段,它会创建此错误,而不是引发ValidationError KeyError at /operations/enter-exit-area/ 'work_area' Request Me
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']
→ <代码>区域=已清理的数据。获取(“工作区域”)