【问题标题】:Could not parse the remainder: '(audio_only=True)'无法解析剩余部分:'(audio_only=True)'
【发布时间】:2022-01-24 08:44:40
【问题描述】:

在我的templates/videos.html,

<div class="grid grid-cols-3 gap-2">
    {% for vid in videos.streams.filter(audio_only=True) %}
        <a href="{{vid.url}}">{{vid.resolution}}</a>
    {% endfor %}
</div>

错误是,

Could not parse the remainder: '(audio_only=True)' from 'videos.streams.filter(audio_only=True)'

当我从views.py 传递all_videos = videos.streams.filter(audio_only=True) 作为上下文时,我可以解决这个问题,在templates/videos.html 中,我将videos.streams.filter(audio_only=True) 替换为all_videos,

但我想知道有没有其他方法可以解决这个问题

【问题讨论】:

  • 你不能在 Django 模板中调用 subscrip t 的函数。
  • 您需要在视图中创建过滤后的查询集。
  • 你可以通过创建单独的模板标签来做到这一点,但我不建议这样做,因为它可以简单地在视图中完成。为什么要在模板中执行此操作,我没有看到任何用例。

标签: python django django-templates


【解决方案1】:

但我想知道有没有其他方法可以解决这个问题。

您可以向Video 模型添加一个不带参数的额外属性/方法,并调用该属性以获取过滤后的查询集。

例如:

class Video(models.Model):
    # …
    
    @property
    def audio_streams(self):
        return self.streams.filter(audio_only=True)

然后使用{% for video in videos.audio_streams %}。但无论如何,Django 模板语言已被故意限制以防止人们编写:模板应该实现 rendering 逻辑,而不是 业务 逻辑:业务逻辑属于模型和观点。所以唯一干净的解决方案是在 view 中过滤,而不是在模板中过滤。

【讨论】:

    猜你喜欢
    • 2011-04-03
    • 2011-11-06
    • 2013-10-26
    • 2018-03-31
    • 2020-05-10
    • 2017-11-18
    • 1970-01-01
    • 2022-10-05
    • 2019-03-12
    相关资源
    最近更新 更多