首页 > 解决方案 > 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})

在此处输入图像描述在此处输入图像描述在此处输入图像描述

标签: pythondjangoformsvalidation

解决方案


推荐阅读