Использование с и если одновременно в шаблоне django - PullRequest
0 голосов
/ 13 февраля 2020

мое мнение: я использовал 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 %}

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Вам необходимо проверить, равны ли id из test и test_id из Subtest или нет. Если равен, то покажите подтест по этому тесту.

<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 %}
0 голосов
/ 13 февраля 2020

Вы можете использовать метод модели, чтобы получить все sub_tests под тестом

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

В templated_context_processor просто передать список тестовых объектов:

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...