与父类别和子类别相关联的 Django mptt 渲染项目

时间:2021-02-27 08:28:29

标签: python django django-models django-mptt

我正在为病理学/实验室报告系统构建一个 django 应用程序。我需要一个表格,它可以为不同的测试(例如(HIV 阴性,一些测试 10))取值。由于有 100 和 1000 个测试,这些测试按化学测试、显微镜测试等类别分组。我需要为这些测试渲染一个带有表单的模板。我使用了 django-mptt 并且在 django admin 中构建结构似乎很容易,但我无法让它在前端模板中工作。以下是我的项目代码和描述。


class TestCategory(MPTTModel):
    name = models.CharField(max_length=100)
    parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children')
    is_active = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)
    update_at = models.DateTimeField(auto_now=True)

    class Meta:
        verbose_name_plural = "Test Categories"

    class MPTTMeta:
        order_insertion_by = ['name']
    
    def __str__(self):
        return self.name


class Test(models.Model):
    QUALITATIVE = "1"
    QUANTITATIVE = "0"
    TEST_TYPE_CHOICES = [
        (QUALITATIVE, 'QUALITATIVE'),
        (QUANTITATIVE, 'QUANTITATIVE'),
    ]
    test_category = TreeForeignKey(TestCategory, on_delete=models.CASCADE, related_name='test_category')
    name = models.CharField(max_length=50)
    unit = models.CharField(max_length=10)
    specimen = models.ForeignKey(Specimen, on_delete=models.CASCADE, blank=True, null=True)
    test_type = models.CharField(max_length=2, choices=TEST_TYPE_CHOICES, default=QUALITATIVE)
    reference_text = models.TextField()
    price = models.DecimalField(max_digits=10, decimal_places=2, blank=True, default=0, verbose_name='Price Per Unit')
    is_active = models.BooleanField(default=True)

    def __str__(self):
        return self.name
    
    class Meta:
        ordering = ['test_category']
    

# views.py

def report_create_view(request, pk): 
context ={} 
form = CreateReportForm(request.POST or None) 

if form.is_valid(): 
    patient = self.objects.all().filter(patient_id=pk)
    form.instance.patient_id = patient.patient_id
    form.save() 
        
context['form']= form 
context['patient'] = Patient.objects.all().filter(pk=pk)
context['nodes'] = TestCategory.objects.all()
return render(request, "lab/report_form.html", context) 

#template report_form.html

{% load crispy_forms_tags %}
{% load mptt_tags %}
    <form method="post" novalidate>
    {% csrf_token %}
    {{ form|crispy }}
  
   {% for node,structure in nodes|tree_info %}
        {% if structure.new_level %}<ul><li>{% else %}</li><li>{% endif %}
            {{ node.name }}
        {% for level in structure.closed_levels %}</li></ul>{% endfor %}
    {% endfor %}
    
    <button type="submit" class="btn btn-success">Add Report</button>
  </form>

这就是我的模板现在的样子。如您所见,我的表单只有类别名称(我得到的只有 TestCategory 模型节点实际的测试模型。如何实际呈现按类别分组的测试?

result

0 个答案:

没有答案