如何比较两个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()吗???请 我认为可以通过查询Event
或EventDelegate
?我在这里从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 循环
Java-Spark:如何在循环中迭代时获取 Dataset<Row> 列的值并在 when().otherwise() 中使用它?