我对此很陌生。我有一个基本上是签入/签出表格的应用程序。该表格有3个字段,其中两个是必填字段,一个是可选字段。 “区域”中必填字段之一,而“站”则是唯一不需要的字段,因为不是每个区域都有一个站,因此有时将没有选择的选项。如果您填写所有3个字段,当前工作正常,但是即使桩号为空,即使该区域没有桩号也不能。
我收到此错误:ValueError: invalid literal for int() with base 10: ''
我很确定问题出在我的views.py中,因为这两个动作都在我的if语句中同时出现了回车/离开,但是我不确定它到底是什么。这些if语句的要点是:
[如果某人进入一个区域并忘记离开然后再进入另一个区域,则该程序将创建一个新条目,并且在该人离开新区域后不触摸先前的区域条目(一个人可以进入和离开同一区域/站点多次),因此当他们离开时,最新的条目将是唯一被修改的条目。这与休假区域的概念类似,我添加的许多过滤器是为了避免对以前的条目进行修改,因为.update()是对过滤器之后剩下的所有内容(不仅是最新的)进行大规模更新。
models.py
class WorkArea(models.Model):
name = models.CharField(max_length=50)
def __str__(self):
return self.name
class StationNumber(models.Model):
work_area = models.ForeignKey(WorkArea, on_delete=models.CASCADE)
name = models.CharField(max_length=50)
def __str__(self):
return self.name
class EmployeeWorkAreaLog(models.Model):
employee_number = models.IntegerField(max_length=50, help_text="Employee #", 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(StationNumber, on_delete=models.SET_NULL, null=True, help_text="Station", related_name="stations", blank=True)
time_in = models.DateTimeField(help_text="Time in", null=True, blank=True)
time_out = models.DateTimeField(blank=True, help_text="Time out", null=True)
def __str__(self):
return self.employee_number
forms.py
class WarehouseForm(AppsModelForm):
class Meta:
model = EmployeeWorkAreaLog
fields = ('employee_number', 'work_area', 'station_number')
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['station_number'].queryset = StationNumber.objects.none()
if 'work_area' in self.data:
try:
work_area_id = int(self.data.get('work_area'))
self.fields['station_number'].queryset = StationNumber.objects.filter(work_area_id=work_area_id).order_by('name')
except (ValueError, TypeError):
pass
elif self.instance.pk:
self.fields['station_number'].queryset = self.instance.work_area.stations.order_by('name')
views.py
class EnterExitArea(CreateView):
model = EmployeeWorkAreaLog
template_name = "operations/enter_exit_area.html"
form_class = WarehouseForm
def form_valid(self, form):
emp_num = self.request.POST['employee_number']
area = self.request.POST['work_area']
station = self.request.POST['station_number']
if 'enter_area' in self.request.POST:
form.save()
if EmployeeWorkAreaLog.objects.filter(Q(employee_number=emp_num) & Q(work_area=area) & Q(time_out__isnull=True) & Q(time_in__isnull=True)).filter(Q(station_number=station) | Q(station_number__isnull=True)):
EmployeeWorkAreaLog.objects.filter(Q(employee_number=emp_num) & Q(work_area=area) & Q(time_out__isnull=True) & Q(time_in__isnull=True)).update(time_in=datetime.now())
return HttpResponseRedirect(self.request.path_info)
elif 'leave_area' in self.request.POST:
if EmployeeWorkAreaLog.objects.filter(employee_number=emp_num, work_area=area, station_number=station, time_out__isnull=True):
recent = EmployeeWorkAreaLog.objects.filter(employee_number=emp_num, work_area=area, station_number=station, time_out__isnull=True).latest('time_in').time_in
EmployeeWorkAreaLog.objects.filter(employee_number=emp_num, work_area=area, station_number=station, time_out__isnull=True, time_in=recent).update(time_out=datetime.now())
return HttpResponseRedirect(self.request.path_info)
form.save()
EmployeeWorkAreaLog.objects.filter(employee_number=emp_num, work_area=area, station_number=station).update(time_out=datetime.now())
return HttpResponseRedirect(self.request.path_info)
def load_stations(request):
work_area_id = request.GET.get('work_area')
stations = StationNumber.objects.filter(work_area_id=work_area_id).order_by('name')
return render(request, 'operations/station_number_dropdown_options.html', {'stations': stations})
TRACEBACK
Internal Server Error: /operations/enter-exit-area/
Traceback (most recent call last):
File "C:\Users\mkusneco\appsve\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
response = get_response(request)
File "C:\Users\mkusneco\appsve\lib\site-packages\django\core\handlers\base.py", line 126, in _get_response
response = self.process_exception_by_middleware(e, request)
File "C:\Users\mkusneco\appsve\lib\site-packages\django\core\handlers\base.py", line 124, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\mkusneco\appsve\lib\site-packages\django\views\generic\base.py", line 68, in view
return self.dispatch(request, *args, **kwargs)
File "C:\Users\mkusneco\appsve\lib\site-packages\django\views\generic\base.py", line 88, in dispatch
return handler(request, *args, **kwargs)
File "C:\Users\mkusneco\appsve\lib\site-packages\django\views\generic\edit.py", line 172, in post
return super().post(request, *args, **kwargs)
File "C:\Users\mkusneco\appsve\lib\site-packages\django\views\generic\edit.py", line 142, in post
return self.form_valid(form)
File "C:\Users\mkusneco\apps.rsrgroup.com\apps\operations\views.py", line 24, in form_valid
if EmployeeWorkAreaLog.objects.filter(Q(employee_number=emp_num) & Q(work_area=area) & Q(time_out__isnull=True) & Q(time_in__isnull=True)).filter(Q(station_number=station) | Q(station_number=None)):
File "C:\Users\mkusneco\appsve\lib\site-packages\django\db\models\query.py", line 844, in filter
return self._filter_or_exclude(False, *args, **kwargs)
File "C:\Users\mkusneco\appsve\lib\site-packages\django\db\models\query.py", line 862, in _filter_or_exclude
clone.query.add_q(Q(*args, **kwargs))
File "C:\Users\mkusneco\appsve\lib\site-packages\django\db\models\sql\query.py", line 1263, in add_q
clause, _ = self._add_q(q_object, self.used_aliases)
File "C:\Users\mkusneco\appsve\lib\site-packages\django\db\models\sql\query.py", line 1281, in _add_q
current_negated, allow_joins, split_subq)
File "C:\Users\mkusneco\appsve\lib\site-packages\django\db\models\sql\query.py", line 1287, in _add_q
split_subq=split_subq,
File "C:\Users\mkusneco\appsve\lib\site-packages\django\db\models\sql\query.py", line 1225, in build_filter
condition = self.build_lookup(lookups, col, value)
File "C:\Users\mkusneco\appsve\lib\site-packages\django\db\models\sql\query.py", line 1096, in build_lookup
lookup = lookup_class(lhs, rhs)
File "C:\Users\mkusneco\appsve\lib\site-packages\django\db\models\lookups.py", line 20, in __init__
self.rhs = self.get_prep_lookup()
File "C:\Users\mkusneco\appsve\lib\site-packages\django\db\models\fields\related_lookups.py", line 115, in get_prep_lookup
self.rhs = target_field.get_prep_value(self.rhs)
File "C:\Users\mkusneco\appsve\lib\site-packages\django\db\models\fields\__init__.py", line 965, in get_prep_value
return int(value)
ValueError: invalid literal for int() with base 10: ''
[25/Oct/2019 11:21:47] "POST /operations/enter-exit-area/ HTTP/1.1" 500 172567
您有一个表单,但是您忽略了它。该表格将有助于将所有原始过帐的数据转换为相关类型,特别是它将将您从station_number
获得的整数ID转换为StationNumber的实际实例。但是,您没有使用表单的cleaned_data。相反,您可以返回原始POST。不要那样做。
应该是:
def form_valid(self, form):
emp_num = form.cleaned_data['employee_number']
area = form.cleaned_data['work_area']
station = form.cleaned_data['station_number']
...