Django: ошибка при проверке поля формы int () / str - PullRequest
0 голосов
/ 06 февраля 2020

Я разрабатываю приложение Django и у меня возникает ошибка при отправке формы обновления, и я не понимаю, как моя форма обновляет модель Сортировка ie (ниже), и возникает ошибка с переменной asp_sor_pre (integer):

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')]

models.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()

forms.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)

views.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})

enter image description hereenter image description hereenter image description here

...