如何比较两个for循环的值并在django模板中使用if语句?

Posted

技术标签:

【中文标题】如何比较两个for循环的值并在django模板中使用if语句?【英文标题】:How to compare values of two for loops and use if statement in django template? 【发布时间】: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>

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

【问题讨论】:

【参考方案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)来引用注释。我的猜测是,如果这很重要,这将是最有效的。

【讨论】:

以上是关于如何比较两个for循环的值并在django模板中使用if语句?的主要内容,如果未能解决你的问题,请参考以下文章

如何在循环中添加 Thymeleaf 变量中的值并在完成循环后显示最终值

如何在 Django 模板语言中正确构建 for 循环

如何在 django 模板的单个表体中添加两个 for 循环

在 django 模板中获取项目的值以进行循环

如何在 django 模板的 for 循环中加载图像?

Java-Spark:如何在循环中迭代时获取 Dataset<Row> 列的值并在 when().otherwise() 中使用它?