首页 > 解决方案 > 在 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 %}

标签: pythondjango

解决方案


您需要检查idoftesttest_idofSubtest是否相等。如果相等,则显示该测试下的子测试。

<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 %}

推荐阅读