Я разрабатываю приложение 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})