Python 在django模板中同时使用with和if
我的观点:为了方便起见,我使用了模板化的上下文处理器Python 在django模板中同时使用with和if,python,django,Python,Django,我的观点:为了方便起见,我使用了模板化的上下文处理器 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):
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 %}
-
{测试%中的测试为%0}
-
{子测试%中的子测试为%1}
{%以subtest.test作为名称%}
{%if name%}
-
{{subtest.name}
{%endif%}
{%endwith%}
{%endfor%}
您需要检查测试的id
和子测试的测试id
是否相等。如果相等,则显示该测试下的子测试
-
{测试%中的测试为%0}
-
{子测试%中的子测试为%1}
{%if subtest.test_id==test.id%}
-
{{subtest.name}
{%endif%}
{%endfor%}
我不认为您是否需要这里的{%with%}
另一种方法是将prefetch\u related
与您的Test
模型一起使用。它将获得特定测试的所有子测试
def list_子测试(请求):
返回{'test':test.objects.all().prefetch_related('subtest')}
然后在模板中,您可以通过迭代test.subtest.all
获得子测试
{%用于test.subtest.all%中的子测试
{{subtest.name}
{%endfor%}
您可以使用model方法获得测试下的所有sub_测试
class Test(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
def get_subtests(self):#model methods
return Subtest.objects.filter(test=self)
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
在模板化的上下文中,处理器只需传递测试对象列表:
def list_subtest(request):
return {'test':Test.objects.all()}
在Django模板中:
<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 test.get_subtests %}
<li>
<div class="checkbox-group">
<input type="checkbox" id="aUniqueName" name="example"/>
<label for="aUniqueName">
{{subtest.name}}
</label>
</div>
</li>
{% endfor %}
</ul>
</div>
{% endfor %}
</form>
{测试%中的测试为%0}
-
{test.get_subtests%中的子测试为%s}
-
{{subtest.name}
{%endfor%}
{%endfor%}
模板中的test.subtest.all是预取相关(“subtest”)test.subtest.all中的子测试,是特定测试的子测试prefetch_related('subtest')
表示获取每个测试对象的子测试对象。请注意,您实际上不需要调用prefetch_related
,这是一个受欢迎的优化(减少数据库查询)。同意@brunodesshuilliers,这里的prefetch\u related
用于减少数据库查询的数量。您应该阅读文档,这样可以节省无用的工作-这是反向关系管理器提供的(test.subtest.all()
)。