django - 获取 Wagtail 页面模型的随机对象,但不是当前对象
问题描述
所以我有这个模板上下文处理器:
from cases.models import CasePage
def random_case(request):
case = CasePage.objects.live().order_by('?')
return {'random_case': case}
在模板中我这样做:
{% for entry in random_case %}
{% if request.get_full_path != entry.get_url %}
{% if forloop.first %}
<a class="ajax-link project-next" href="{{ entry.get_url }}">
<div class="nav-project-title">{{ entry.title }}</div>
<div class="nav-title">next</div>
</a>
{% endif %}
{% endif %}
{% endfor %}
这可行,但问题是有时对象与页面相同,因此没有显示任何内容。如果该条目会被跳过以支持下一个条目,那就太好了。对我来说,模板中的逻辑也太多了。将此逻辑移入上下文处理器并使其工作的最佳方法是什么?
解决方案
random_case
创建一个 的方法,CasePage
并过滤掉 ID 等于 的案例self
。
class CasePage(Page):
# ...
def random_case(self):
return CasePage.objects.live().exclude(id=self.id).order_by('?').first()
然后,您可以在模板中将此方法称为page.random_case
- 请记住,每次调用都会做出新的随机选择,因此您可能需要类似{% with page.random_case as case %}
.
推荐阅读
- html - 如何拉伸一行元素中的第一个元素
- pivot - 如何在 pinescript 中将浮点数格式化为 3 位小数
- android - 如何为 React Native 锁定设备方向
- gremlin - 使用单个查询在 JanusGraph 中创建多个顶点
- javascript - 如何在一个 html 中使用 swiperjs 使用不同的 swiper
- java - 如何在JAVA中用另一个类对象从主类调用主类的方法
- python - 将安全组中的 ip 列入白名单的 Lambda 函数
- javascript - 为什么有条件渲染的 React 组件在刷新时会闪烁,而不是同一组件的内联版本?
- c++ - 在构造函数中调用函数给出不同的结果c ++
- view - SwiftUI:如何检测两个视图是否相互交叉?