在Django模板中访问查询集的“ values_list”

时间:2018-11-20 05:31:38

标签: django django-templates django-views

我正在尝试访问模板中query_set的values_list

在一种观点中,我使用以下if语句来确定给定的Outcome(模型)是否存在Participant(模型):

if not form.cleaned_data['timepoint'] in patient.outcome_set.values_list('timepoint', flat=True):

这很好用-现在我希望能够与模板中的values_list做类似的事情。但是,当我尝试将values_list限制为模型上的timepoint变量时,它将引发TemplateSyntaxError Could not parse the remainder: '('template')' from 'patient.outcome_set.values_list('template')'

如果我使用values_list{{ patient.outcome_set.values_list }}打印到屏幕上,则会很好地打印每个结果的所有值,但是我不知道如何将values_list限制为仅时间点变量。 / p>

当前模板:

<table>
  <thead>
    <tr>
      <th>Patient</th>
      <th>Baseline</th>
      <th>Follow-up</th>
    </tr>
  </thead>
  <tbody>
    {% for patient in patients %}
      <tr>
        <td>{{ patient.name }}</td>

        {% if 'baseline' in patient.outcome_set.values_list('timepoint') %}
          <td>INSERT TICK</td>
        {% else %}
          <td>INSERT CROSS</td>
        {% endif %}

        {% if 'followup' in patient.outcome_set.values_list('timepoint') %}
          <td>INSERT TICK</td>
        {% else %}
          <td>INSERT CROSS</td>
        {% endif %}

      </tr>
    {% endfor %}
  </tbody>
</table>

1 个答案:

答案 0 :(得分:1)

尽管这种逻辑更适合视图,但您可以为此使用custom template tag。像下面这样。

# extra_tags.py

@register.filter
def get_value_in_qs(queryset, key):
    return queryset.values(key, flat=True)

然后您可以通过以下方式在模板中使用它:

{% load extra_tags %}
...
    {% for patient in patients %}
      <tr>
        <td>{{ patient.name }}</td>

        {% if 'baseline' in patient.outcome_set|get_value_in_qs:'timepoint' %}
# or for better readability use a with tag
{% with patient_timepoint=patient.outcome_set|get_value_in_qs:'timepoint' %}
{% if 'baseline' in patient_timepoint %} ...



....