【问题标题】:How to compare values of two for loops and use if statement in django template?如何比较两个for循环的值并在django模板中使用if语句?
【发布时间】:2020-05-09 14:37:53
【问题描述】:

这可能是一个令人困惑的问题。 我在 sqllite 中有三个表:1) 事件 2) 代表 3) EventDelegate 第一个存储所有事件,第二个存储所有代表,第三个包含 eventid 和 delegateid 以显示特定代表正在参加该特定事件。 在我的事件详细信息页面中,我只想显示其 id 存在于 event_delegate 表中的代表以及该事件 id。目前我正在使用此代码但无法正常工作

views.py

def event_det(request, eid):
    data = Event.objects.filter(id=eid) //SELECTING ONLY THE CLICKED EVENT
    data2 = Delegate.objects.all() // SELECTING ALL THE DELEGATES FROM DB
    data3 = EventDelegate.objects.filter(event_id=eid) //SELECTING RECORDS FROM EVENT_DELEGATE WHERE eventid is eid
    return render(request, 'event_details.html', {'event': data, 'delegates': data2, 'selectdelegates': data3})

模板

<tbody>
   {% for del in delegates %}
   {% for sd in selectdelegates %}
   {% if del.id == sd.delegate_id %}
   <tr>
      <td>{{ del.id }}</td>
      <td>{{ del.first_name }} {{ del.last_name }}</td>
      <td>{{ del.email }}</td>
      <td>{{ del.phone }}</td>
      <td>{{ del.company }}</td>
      <td>{{ del.designation }}</td>
      <td><a href="{% url 'delegate' dataset_id=del.dataset_id %}">View</a></td>
   </tr>
   {% endif %}
   {% endfor %}
   {% endfor %}
</tbody>

如果需要,我可以分享更多详细信息...

【问题讨论】:

    标签: python django python-3.x for-loop django-templates


    【解决方案1】:

    如果你在事件和事件委托之间有这样的关系:

    class EventDelegate(models.Model):
        event = models.ForeignKey(Event, on_delete=models.DO_NOTHING)
        delegate = models.ForignKey(Delegate, on_delete=models.DO_NOTHING)
    

    那你可以这样试试:

    def event_det(request, eid):
        data = Event.objects.get(id=eid) //SELECTING ONLY THE CLICKED EVENT
        return render(request, 'event_details.html', {'event': data})
    
    # template
    
    {% for e in event.eventdelegate_set.all %}
         <tr>
          <td>{{ e.delegate.id }}</td>
          <td>{{ e.delegate.first_name }} {{ e.delegate.last_name }}</td>
          <td>{{ e.delegate.email }}</td>
          <td>{{ e.delegate.phone }}</td>
          <td>{{ e.delegate.company }}</td>
          <td>{{ e.delegate.designation }}</td>
          <td><a href="{% url 'delegate' dataset_id=e.delegate.dataset_id %}">View</a></td>
       </tr>
    {% endfor %}
    

    替代解决方案:

    #view
    def event_det(request, eid):
        data = EventDelegate.objects.filter(id=eid) //SELECTING ONLY THE CLICKED EVENT
        return render(request, 'event_details.html', {'event_delegates': data})
    
    # template
    
    {% for e in event_delegates %}
      // rest of the code as above example
    

    更多信息可以在documentation找到。

    【讨论】:

    • 不是这一行应该是这样的 ``` data = EventDelegate.objects.get(event_id=eid) //仅选择被点击的事件 ``
    • 我认为在您的回答中,views.py 代码不完整。请问你能提供完整的视图函数event_det()吗???请
    • 我认为可以通过查询EventEventDelegate?我在这里从Event 反向查询。但是您也可以使用EventDelegate。查看我的更新答案:
    【解决方案2】:

    如果我理解正确的话,EventDelegate 模型对 Event 和 Delegate 都有 ForeignKey。所以你想要的是一个 EventDelegate 对象的查询集,这些对象链接到相关事件。

    ed_qs = EventDelegate.objects.filter( event_id = event.id )
    

    (也许添加 .order_by( "delegate__lastname") 用于 alpha 排序和 .select_related()

    将此传递给您的模板,然后

    <tbody>
    {% for ed in ed_qs %}
    
       <tr>
       {{ed.delegate.whatever}} ...
    

    或者,您可以在查询集中使用.annotate 将链接委托的所需字段复制到返回的对象上。然后,您将通过您选择的注释名称(例如 {{ed.delegate_firstname}})来引用注释。我的猜测是,如果这很重要,这将是最有效的。

    【讨论】:

      猜你喜欢
      • 2021-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-27
      • 1970-01-01
      • 2013-01-14
      • 2014-04-25
      • 1970-01-01
      相关资源
      最近更新 更多