python - Django:表单字段验证错误 int() / str
问题描述
我开发了一个 Django 应用程序并在提交更新表单时出现错误,我不明白我的表单更新模型排序(下)并且 asp_sor_pre 变量(整数)发生错误:
ValueError: int() 以 10 为底的无效文字:''
下面是 Django 引发的错误的踪迹
我的问题是我不确定哪个字段会引发此错误......我已经确定了一个引发此错误的场景:
当数据库实例是:
med_num : AAA
asp_sor_dat : 2020-02-01
asp_sor_typ : 2
asp_sor_pre : null
pat : null
asp_sor_des : TR
asp_sor_loc : CR
opr_nom : admin
opr_dat : 2020-02-01
我尝试更新:
med_num : AAA
asp_sor_dat : 2020-02-01
asp_sor_typ : 3 *********
asp_sor_pre : null
pat : patient1 *********
asp_sor_des : null *********
asp_sor_loc : CR
opr_nom : admin
opr_dat : 2020-02-01
错误应与以下 4 个字段之一链接:asp_sor_typ、asp_sor_pre、pat、asp_sor_des
在提交之前,asp_sor_pre是 NoneType 并且当我提交表单时,它是一个引发错误的字符串类型......我不明白它如何/为什么变成一个字符串......?
表单域asp_sor_pre是一个 ChoiceField ,选择=REASON
REASONS 是从词库模型中提取的元组列表:
[(None, ''), (1, 'Deteriorated'), (2, 'Obsolete'), (3, 'Lost')]
模型.py
class Sortie(models.Model):
asp_sor_cle = models.AutoField(primary_key=True)
asp_sor_loc = models.CharField("Site concerned by the operation", max_length=10, null=True, blank=True)
med_num = models.CharField("Trial bacth number", max_length=3, null=True, blank=True)
asp_sor_dat = models.DateField("Release date", null=True, blank=True)
asp_sor_typ = models.IntegerField("Output type", null=True, blank=True)
asp_sor_pre = models.IntegerField("Reason for deactivation", null=True, blank=True)
pat = models.CharField("Patient code", max_length=10, null=True, blank=True)
asp_sor_des = models.CharField("Processing destination in case of transfer", max_length=10, null=True, blank=True)
opr_nom = models.CharField("Input operator", max_length=10, null=True, blank=True)
opr_dat = models.DateField("Entry date", null=True, blank=True)
log = HistoricalRecords()
表格.py
class UpdateOutputForm(forms.ModelForm):
def __init__(self, request, *args, **kwargs):
super(UpdateOutputForm, self).__init__(*args, **kwargs)
self.request = request
self.language = request.session.get('language')
self.user = request.user.id # id de l'utilisateur
self.user_pays = request.session.get('user_pays') # pays de l'utilisateur
self.user_site_type = request.session.get('user_site_type') # type de site de l'utilisateur ('International','National','Site')
if self.language == 'en':
PAYS = Pays.options_list_eng(self.user_pays,self.user_site_type)
SITE_CONCERNE = Site.options_list_site_concerne_eng(self.user,self.user_pays,self.user_site_type)
SITE_PROVENANCE = Site.options_list_site_provenance_eng(self.user_site_type,self.user_pays)
SITE_DESTINATION = SITE_PROVENANCE # même définition
TYPE = Thesaurus.options_list_eng(12)
REASON = Thesaurus.options_list_eng(13)
else:
PAYS = Pays.options_list_fra(self.user_pays,self.user_site_type)
SITE_CONCERNE = Site.options_list_site_concerne_fra(self.user,self.user_pays,self.user_site_type)
SITE_PROVENANCE = Site.options_list_site_provenance_fra(self.user_site_type,self.user_pays)
SITE_DESTINATION = SITE_PROVENANCE # même définition
TYPE = Thesaurus.options_list_fra(12)
REASON = Thesaurus.options_list_fra(13)
# Liste de tous les traitements inscrits dans la table entrée (pha_asp_ent.med_num)
# vérifiant pha_asp_ent.asp_ent_loc = ValeurSaisie(asp_sor_loc) group by med_num -> mise à jour après sélection
MEDICAMENTS = Entree.medicaments_output()
self.fields["asp_sor_loc"] = forms.ChoiceField(label = _("Site concerned by the operation"), widget=forms.Select, choices=SITE_CONCERNE)
self.fields["med_num"] = forms.CharField(label = _("Trial batch number"), required=True, disabled=True)
self.fields["asp_sor_dat"] = forms.DateField(
label = _("Entry date"),
# initial = timezone.now(),
required = True,
)
self.fields["asp_sor_typ"] = forms.ChoiceField(label = _("Output type"), widget=forms.Select, choices=TYPE)
self.fields["asp_sor_pre"] = forms.ChoiceField(label = _("Reason for deactivation"), widget=forms.Select, choices=REASON, required=False)
self.fields["pat"] = forms.CharField(label = _("Patient code"), required=False)
self.fields["asp_sor_des"] = forms.ChoiceField(label = _("Destination in case of transfert"), widget=forms.Select, choices=SITE_DESTINATION, required=False)
视图.py
@login_required
@permission_required('pharmacy.can_manage_drugs')
def update_output(request,pk):
drug = get_object_or_404(Sortie, asp_sor_cle = pk)
form = UpdateOutputForm(request, data=request.POST or None, instance = drug)
if form.is_valid():
medicament = form.save()
asp_sor_typ_after = int(form.cleaned_data['asp_sor_typ'])
if asp_sor_typ_after == 1:
medicament.pat = None
medicament.asp_sor_des = None
if asp_sor_typ_after == 2:
medicament.asp_sor_pre = None
medicament.pat = None
if asp_sor_typ_after == 3:
medicament.asp_sor_des = None
medicament.asp_sor_pre = None
else:
pass
medicament.opr_nom = request.user.username
medicament.opr_dat = timezone.now()
form.save()
# Mise à jour de la base de données -> adm_med
# récupération de la ligne correspondant au numéro saisie
drug = Medicament.objects.get(med_num = medicament.med_num)
drug.med_sit = medicament.asp_sor_loc # Si modif de valeur sur asp_ent_loc : adm_med.med_sit = asp_ent_loc
drug.med_dat = medicament.opr_dat
drug.save()
return redirect('pharmacy:index_output')
return render(request, 'pharmacy/update_output.html', {'form': form})
解决方案
推荐阅读
- python - 多标签分类或多类分类或序列标注问题?
- php - 如何访问 Symfony 中的绝对 URL 并提升一级?
- sql - 两个表的 SQL Server 外键分区
- javascript - 无法在 .css() 函数中分配多个 HTML 元素
- git - Git 管道复用容器
- c++ - 如何将“10:10”翻译成纪元格式
- gcc - avr-gcc 版本:不会从 5.4 更新到 9.2
- python-3.x - Python:请求中的 POST 数据问题
- office-js - Microsoft Outlook O365“加载项错误”自动重启
- c# - 更改 datetimepicker 背景颜色 C#