【问题标题】:Trying to auto-populate a model field using JavaScript and it does not work尝试使用 JavaScript 自动填充模型字段但它不起作用
【发布时间】:2021-09-15 02:41:29
【问题描述】:

我有一个名为Package 的模型。它有名为diagnosistreatmentpatient_typemax_fractionstotal_package 的字段。字段diagnosistreatmentpatient_type 具有在单独的单独类中定义的外键,使得diagnosistreatmentpatient_type 选择字段。现在我想要的是在选择treatmentpatient_type 时自动填充max_fractionstotal_package 字段。有人建议我使用 JavaScript 来实现这一点。我尝试并编写了代码,但无济于事。我首先在max_fractions 字段上进行尝试,当我成功时,我会为所有需要的字段进行此操作。

谁能帮帮我,不胜感激。

这是我的模型:

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;
}

模板

<!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>

网址

path('package/', views.package_view),

编辑

我刚刚在模板的源页面中注意到 treatmentpatient_type 字段是下拉字段,它具有 selectoption 标签。在option 标记中,值包含自动递增的数字(因为它是外键绑定字段),而不是我作为文本输入的等效值。我在这里有什么选择?

<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>

【问题讨论】:

    标签: javascript html python-3.x django django-models


    【解决方案1】:

    您的模板中有多个表单,这些表单具有类似命名的字段。这实际上意味着您的模板中有重复 ids(甚至name 属性),导致您得到不正确的值。要解决这个问题,你应该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')
            ...
    

    这将导致您的 id 采用 id_&lt;prefix&gt;-&lt;field_name&gt; 的形式,因此您也需要更改 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;
        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;
    }
    

    【讨论】:

    • 很抱歉,我赶上了其他事情。我刚看到你的回答。感谢您指出这一点。但它仍然不起作用。该字段不会自动填充。我需要更改事件或其他什么吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 2014-11-16
    • 2013-04-24
    • 1970-01-01
    • 2022-01-07
    相关资源
    最近更新 更多