【问题标题】:Accessing to objects of a dynamic way in django template在 django 模板中以动态方式访问对象
【发布时间】:2017-04-19 07:26:30
【问题描述】:

我有以下基于类的视图,我在其中执行查询集:

class PatientDetail(LoginRequiredMixin, DetailView):
    model = PatientProfile
    template_name = 'patient_detail.html'
    context_object_name = 'patientdetail'

    def get_context_data(self, **kwargs):
        context=super(PatientDetail, self).get_context_data(**kwargs)
        queryset= RehabilitationSession.objects.filter(patient__slug=self.kwargs['slug'])
        context.update({'patient_session_data': queryset,})
    return context

当我在我的模板中访问patient_session_data 发送的键值时:

{% extends "base.html" %}
{% block content %}
    {{patient_session_data}}
 {% endblock content %}

我得到了QuerySet 对象:

<QuerySet [<RehabilitationSession: Hernando Zambrano Cuellar>, <RehabilitationSession: Hernando Zambrano Cuellar>, <RehabilitationSession: Hernando Zambrano Cuellar>]>

我想访问我的RehabilitationSession 模型的名为upper_extremity 的特定属性,然后我这样做:

{% for upperlimb in patient_session_data %}
    {{upperlimb.upper_extremity}} 
{%endfor%}

我在我的模板中得到了这个:

Izquierda Izquierda Izquierda

这意味着值的三倍,因为我的查询集返回了三个对象。这是逻辑。

为了访问我在模板中创建的单独方法的值:

{{patient_session_data.0.upper_extremity}}

我得到:Izquierda

我的目标

我不知道在我的PatientDetail cbv 中执行的查询集将返回的querysets objects RehabilitationSession 的数量,因为该数字是动态的,所以可能是返回的任意数量的对象。

我想读取每个patient_session_dataupper_extremity的值内容并根据值在我的模板中制作一些东西,

但我想以动态的方式阅读它,不使用{{patient_session_data.&lt;0-1-2-3&gt;.upper_extremity}}

例如在假设的情况下:

#if all objects returned have same value in upper_extremity 
{% if patient_session_data.upper_extremity == 'Izquierda' %}
   <div class="col-md-10">
      <h5>Segmentos corporales a tratar</h5>
      <small>Codo - mano - falange</small>
   </div>                                           
{%endif%}

我认为我已经计算了对象的数量并对其进行了一些操作,因为我没有明确的... 无论返回的对象数量如何,我如何才能以单独的方式访问动态方式返回的对象?


更新

我没有考虑到所有返回的对象在 upper_extremity 中具有不同值的可能性。这意味着我希望当返回的查询集对象具有Izquierda Derecha Izquierda 的混合值时,也能有所作为。

此时(在@2ps 提供的支持下,当查询集对象都具有upper_extremity='Izquierda' 时,当查询集对象都具有upper_extremity='Derecha' 时。

当查询集对象的upper_extremity 的值可能为时,我想执行一些操作:

对象查询集 1:upper_extremity='Derecha'

对象查询集 2:upper_extremity='Izquierda'

对象查询集 3:upper_extremity='Derecha' . .. 等等……

根据@2ps的解决方案,我认为这个评估的核心在:

# Perform a set union with the values of 'upper_extremity' attribute for remove the repeated values(Izquierda and Derecha) and distinct them
upper_extremities = set(queryset.values_list('upper_extremity', flat=True).distinct())

# Create a empty dict like data destiny
all_match = dict()

# Iterate on all values possible
for value in ('Izquierda', 'Derecha', ): # add any other values you want here

    # Fill the dictionary always that the longitude of upper_extremities (values get) be equal to 1 (?) 
    all_match[value] = value in upper_extremities and len(upper_extremities) == 1

# Send the result to the template
context['all_match'] = all_match

在我的模板中我认为...

{% if all_match.Izquierda and all_match.Derecha %}
    <div class="col-md-10">
      <h5>Segmentos corporales a tratar</h5>
      <small>Codo - mano - falange</small>
    </div>
{%endif%}

当对象查询集混合了upper_extremity 值(DerechaIzquierda)时,我如何覆盖另一个场景

谢谢你的新问题,我还没有弄清楚这个过程。

【问题讨论】:

    标签: django django-templates django-template-filters


    【解决方案1】:

    您可以在这里采取几种可能的方法。对于所有izquierda 或所有derecha,您可以执行以下操作:

    class PatientDetail(LoginRequiredMixin, DetailView):
        model = PatientProfile
        template_name = 'patient_detail.html'
        context_object_name = 'patientdetail'
    
        def get_context_data(self, **kwargs):
            context=super(PatientDetail, self).get_context_data(**kwargs)
            queryset= RehabilitationSession.objects.filter(patient__slug=self.kwargs['slug'])
            context['patient_session_data'] = queryset
            # get a list of all upper extremities
            upper_extremities = set(queryset.values_list('upper_extremity', flat=True).distinct())
            all_match = dict()
            for value in ('Izquierda', 'Derecha', ): # add any other values you want here
                all_match[value] = value in upper_extremities and len(upper_extremities) == 1
            context['all_match'] = all_match
            return context
    

    在你的模板中

    #if all objects returned have same value in upper_extremity 
    {% if all_match.Izquierda or all_match.Derecha %}
       <div class="col-md-10">
          <h5>Segmentos corporales a tratar</h5>
          <small>Codo - mano - falange</small>
       </div>                                           
    {%else%}
    {# here we handle all cases with mixed results #}
    {%endif%}
    

    【讨论】:

    • 非常感谢@2ps 的精彩回答,我没有考虑到所有返回的对象在upper_extremity 中具有不同值的可能性。请问您能在我的问题中看到我的更新吗?给您带来的尴尬,我深表歉意
    • @bgarcial:查看更新后的答案。您需要做的就是在模板中添加一个else 块,您就可以处理左右混合的情况。这里唯一的极端情况是(1)我们没有涵盖的值(即,除了 Izquierda 或 Derecha 之外的值用于上极)或(2)查询集中的结果为 0。我假设您在模板的其他地方处理了 (2)。
    猜你喜欢
    • 2016-06-18
    • 2020-08-10
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 2011-06-05
    • 2021-01-06
    • 1970-01-01
    • 2012-07-02
    相关资源
    最近更新 更多