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()
    )。