Django/Python:从模板调用带参数的模型/类函数

3
在Django 2.0中,我正在尝试从模板中调用类中的方法。
从模板中调用。
{% activity.liked_by(user) %}

来自类的方法

class Activity(models.Model):
    name = models.CharField(max_length=15)
    user = models.ForeignKey(User, on_delete=models.CASCADE)

    def liked_by(self, user):
        return Like.objects.filter(activity_id=self.id, user_id=user.id)

我知道这是不可能的,但是最好的替代方案是什么?没有办法在不传递用户参数的情况下执行查询。
谢谢!

在呈现模板的视图中调用result = test.method(user),并将结果添加到模板上下文中。 - user8651755
@Blurp 谢谢,但是这样我就缺少了调用它的类(即self)的部分。 - SJ19
1
我不明白你的意思。 - user8651755
如果您有一个已经正确初始化的类实例,那么从哪里调用它的方法并不重要。您可能需要展示更多的代码以便清楚地了解正在发生的事情。 - user8651755
@guillermochamorro 编辑了我的帖子,视图与 URL 相关,我只需要为用户找到一个整数(用于按钮)。 - SJ19
显示剩余3条评论
1个回答

2
你可以在模板传递的上下文中提供查询内容,或使用自定义模板标签。假设创建的文件名为my_template_tags.py(请注意,此文件必须在正确的目录结构中)。
from django import template

register = template.Library()

@register.simple_tag
def get_method(test, user):
    return Test.objects.filter(test_id=test.id, user_id=user.id)

然后在模板中:

{% load my_template_tags %}
{% get_method test user %}

我有些困惑,所以你不将这个添加到 models.py 中? - SJ19
不,您不需要将其添加到models.py中。当您创建my_template_tags.py时,它必须位于已安装的应用程序中,该应用程序在名为templatetags的文件夹下具有一个包含__init__.py的文件夹。有关结构,请参阅https://docs.djangoproject.com/en/2.0/howto/custom-template-tags/#code-layout - Stuart Dines
这可能是个愚蠢的问题,但我该如何添加一个额外的应用程序?哈哈 - SJ19
完全不需要;应用程序是包含Activity类的models.py文件的文件夹。例如,如果您的models.py文件在名为activities的文件夹中,则在activities中创建一个名为templatetags的新文件夹。在templatetags中创建一个名为__init__.py的文件,该文件可以为空。还在templatetags中创建一个名为my_template_tags.py的文件,这就是模板标记所在的位置。完成后,您需要重新启动服务器。 - Stuart Dines
现在我的最后一个问题是,我如何将 {% get_method test user %} 转换为 if 语句? - SJ19
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接