,因此您也需要更改 JavaScript:function mf(){tt=document.getElementById(id_treatment_form-treatment").value;ptt=document.getElementById(id_patient_form-patient_type").value;if (tt=="YEO5" && ptt=="RUHPE")document.getElementById("id_package_form-max_fractions").value=40;否则如果(tt==D4EG"&&ptt==KILEU")document.getElementById("id_package_form-max_fractions").value=40;否则如果(tt==5GED"&&ptt==IMRA")document.getElementById("id_package_form-max_fractions").value=40;}
I have a model named Package
. It has fields named, diagnosis
, treatment
, patient_type
, max_fractions
and total_package
. The fields diagnosis
, treatment
and patient_type
have foreign keys defined in separate individual classes, making diagnosis
, treatment
and patient_type
choice fields. Now what I want is to auto-populate the max_fractions
and total_package
fields whenever treatment
and patient_type
are selected. I was suggested to use JavaScript to accomplish that. I tried and wrote the codes but to no avail. I'm trying it on max_fractions
field first, when I succeed in doing that, I will do it for all the needed fields.
Can anyone help me on this, it will be much appreciated.
Here are my models:
class Diagnosis(models.Model):
diagnosis=models.CharField(max_length=30, blank=True)
def __str__(self):
return self.diagnosis
class Treatment(models.Model):
treatment=models.CharField(max_length=15, blank=True)
def __str__(self):
return self.treatment
class PatientType(models.Model):
patient_type=models.CharField(max_length=15, blank=True)
def __str__(self):
return self.patient_type
class Package(models.Model):
rt_number=ForeignKey(Patient, on_delete=CASCADE)
diagnosis=models.ForeignKey(Diagnosis, on_delete=CASCADE)
treatment=ForeignKey(Treatment, on_delete=CASCADE)
patient_type=ForeignKey(PatientType, on_delete=CASCADE)
max_fractions=models.IntegerField(default=None)
total_package=models.DecimalField(max_digits=10, decimal_places=2)
forms.py:
class DiagnosisForm(ModelForm):
class Meta:
model=Diagnosis
fields='__all__'
class TreatmentForm(ModelForm):
class Meta:
model=Treatment
fields='__all__'
class PatientTypeForm(ModelForm):
class Meta:
model=PatientType
fields='__all__'
class PackageForm(ModelForm):
class Meta:
model=Package
fields='__all__'
widgets={
"treatment" : forms.Select(attrs={"onmouseup":"mf();"}),
"patient_type" : forms.Select(attrs={"onmouseup":"mf();"}),
}
views.py:
def package_view(request):
if request.method=='POST':
fm_package=PackageForm(request.POST)
fm_diagnosis=DiagnosisForm(request.POST)
fm_treatment=TreatmentForm(request.POST)
fm_patient_type=PatientTypeForm(request.POST)
if fm_package.is_valid() and fm_diagnosis.is_valid() and fm_treatment.is_valid() and fm_patient_type.is_valid():
diagnosis=fm_diagnosis.save()
treatment=fm_treatment.save()
patient_type=fm_patient_type.save()
package=fm_package.save(False)
package.diagnosis=diagnosis
package.treatment=treatment
package.patient_type=patient_type
package.save()
fm_package=PackageForm()
fm_diagnosis=DiagnosisForm()
fm_treatment=TreatmentForm()
fm_patient_type=PatientTypeForm()
return render (request, 'account/package.html', {'form2':fm_diagnosis, 'form3':fm_treatment, 'form4':fm_patient_type, 'form5':fm_package})
else:
fm_package=PackageForm()
fm_diagnosis=DiagnosisForm()
fm_treatment=TreatmentForm()
fm_patient_type=PatientTypeForm()
return render (request, 'account/package.html', {'form2':fm_diagnosis, 'form3':fm_treatment, 'form4':fm_patient_type, 'form5':fm_package})
JavaScript:
function mf(){
tt=document.getElementById("id_treatment").value;
ptt=document.getElementById("id_patient_type").value;
if (tt=="YEO5" && ptt=="RUHPE")
document.getElementById("id_max_fractions").value=40;
else if (tt=="D4EG" && ptt=="KILEU")
document.getElementById("id_max_fractions").value=40;
else if (tt=="5GED" && ptt=="IMRA")
document.getElementById("id_max_fractions").value=40;
}
the template:
<!DOCTYPE html>
{% load static %}
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="{% static 'account/js/myjs.js' %}"></script>
<title>Package Form</title>
</head>
<body>
<form action="" method="post" novalidate>
{% csrf_token %}
{{form2.as_p}}
{{form3.as_p}}
{{form4.as_p}}
{{form5.as_p}}
<input type="submit" value="Submit">
</form>
</body>
</html>
URLs:
path('package/', views.package_view),
EDIT:
I just noticed in the source page of my template that as the treatment
and patient_type
fields are dropdown fields, it has select
and option
tags. In the option
tags, the values contain autoincremented numbers (as it is a foreign key bound field) and not the equivalent values that I entered as text. What are my options here?
<p><label for="id_package_form-treatment">Treatment:</label> <select name="package_form-treatment" required id="id_package_form-treatment">
<option value="" selected>---------</option>
<option value="1">YEO5</option>
<option value="2">2DRT</option>
<option value="3">D4EG</option>
<option value="4">5GED</option>
<option value="5"></option>
</select></p>
<p><label for="id_package_form-patient_type">Patient type:</label> <select name="package_form-patient_type" required id="id_package_form-patient_type">
<option value="" selected>---------</option>
<option value="1">RUHPE</option>
<option value="2">KILEU</option>
<option value="3">IMRA</option>
<option value="5"></option>
</select></p>
解决方案
You have multiple forms in your template, these forms have similarly named fields. Which effectively means you have duplicate ids (and even name
attributes) in your template, causing you to get incorrect values. To solve this you should add a prefix to your forms:
def package_view(request):
if request.method=='POST':
fm_package=PackageForm(request.POST, prefix='package_form')
fm_diagnosis=DiagnosisForm(request.POST, prefix='diagnosis_form')
fm_treatment=TreatmentForm(request.POST, prefix='treatment_form')
fm_patient_type=PatientTypeForm(request.POST, prefix='patient_form')
...
else:
fm_package=PackageForm(prefix='package_form')
fm_diagnosis=DiagnosisForm(prefix='diagnosis_form')
fm_treatment=TreatmentForm(prefix='treatment_form')
fm_patient_type=PatientTypeForm(prefix='patient_form')
...
This will cause your ids to be of the form id_<prefix>-<field_name>
, so you would need to change your JavaScript too:
function mf(){
tt=document.getElementById("id_treatment_form-treatment").value;
ptt=document.getElementById("id_patient_form-patient_type").value;
if (tt=="YEO5" && ptt=="RUHPE")
document.getElementById("id_package_form-max_fractions").value=40;
else if (tt=="D4EG" && ptt=="KILEU")
document.getElementById("id_package_form-max_fractions").value=40;
else if (tt=="5GED" && ptt=="IMRA")
document.getElementById("id_package_form-max_fractions").value=40;
}
这篇关于尝试使用 JavaScript 自动填充模型字段但它不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文