与父类别和子类别关联的Django mptt呈现项

2024-09-24 02:23:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为病理学/实验室报告系统构建django应用程序。我需要一个表格,将采取不同的测试值,如(艾滋病毒阴性,一些测试-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>

这就是我的模板现在的外观。正如您所看到的,我的表单只有categories名称(我得到的是testcategority model only节点)和实际的测试模型。如何实际呈现按类别分组的测试

result


Tags: nametestselfformtruedefaultmodelscontext