python - 在 django 模板中使用 with 和 if 同时
问题描述
我的观点:为了方便起见,我使用了 templated_context_processor
def list_subtest(request):
return {'subtest':Subtest.objects.all(),'test':Test.objects.all()}
我的模型:这里我有测试和子测试模型。例如血液属于测试类别,血红蛋白属于子测试类别
class Test(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Subtest(models.Model):
name = models.CharField(max_length=100)
test = models.ForeignKey(Test,on_delete=models.CASCADE,related_name='subtest',blank=True, null=True)
unit = models.CharField(max_length=10)
reference_value = models.IntegerField()
selected = models.BooleanField(default=False)
def __str__(self):
return self.name
我的模板:我想显示属于同一测试的测试和子测试。
<ul class="nav-list">
<li>
<a href="#">Test</a>
<form class="hero-menu">
{% for test in test %}
<div class="category-block">
<ul class="dropdown-list">
<li>
<a href="#"><h4 data-modal-target="menu-test-popup">
{{test.name|title}}
</h4></a>
</li>
{% for subtest in subtest %}
{% with subtest.test as name %}
{% if name %}
<li>
<div class="checkbox-group">
<input type="checkbox" id="aUniqueName" name=
value="example"/>
<label for="aUniqueName">
{{subtest.name}}
</label>
</div>
</li>
{% endif %}
{% endwith %}
{% endfor %}
解决方案
您需要检查id
oftest
和test_id
ofSubtest
是否相等。如果相等,则显示该测试下的子测试。
<ul class="nav-list">
<li>
<a href="#">Test</a>
<form class="hero-menu">
{% for test in test %}
<div class="category-block">
<ul class="dropdown-list">
<li>
<a href="#"><h4 data-modal-target="menu-test-popup">
{{test.name|title}}
</h4></a>
</li>
{% for subtest in subtest %}
{% if subtest.test_id == test.id %}
<li>
<div class="checkbox-group">
<input type="checkbox" id="aUniqueName" name="{{ subtest.name }}" value="example"/>
<label for="aUniqueName">
{{subtest.name}}
</label>
</div>
</li>
{% endif %}
{% endfor %}
我不认为你是否需要{% with %}
这里。
另一种方法可能是prefetch_related
与您的Test
模型一起使用。它将获得特定测试的所有子测试。
def list_subtest(request):
return {'test':Test.objects.all().prefetch_related('subtest')}
然后在您的模板中,您可以通过迭代来获得子测试test.subtest.all
。
{% for subtest in test.subtest.all %}
<li>
<div class="checkbox-group">
<input type="checkbox" id="aUniqueName" name="{{ subtest.name }}" value="example"/>
<label for="aUniqueName">{{subtest.name}}</label>
</div>
</li>
{% endfor %}