如何在 Django 模板中的 if 语句中调用函数

How to call function within if statement in Django template

我有一个自定义模板标签如下:

@register.simple_tag
def call_method(obj, method_name, *args):
    """
    Usage
    in shell
    obj.votes.exists(user_id)

    in template
    {% call_method obj.votes 'exists' user.id %}
    """
    method = getattr(obj, method_name)
    return method(*args)

然后我可以在模板中调用它(Class-based detail view)如下。

{% call_method object.votes 'exists' user.id %}

我的问题是如何在 If 语句中使用这个模板标签? 例如,为什么我不能使用 like:

{% if call_method object.votes 'exists' user.id %}

我正在使用 django-vote [https://github.com/shanbay/django-vote][1]

我的目标是检查用户是否已经投票,以便我可以更改投票按钮的 class。 否则,我已经可以查看它了。而且效果很好。

如果无法在 If 语句中使用带有参数的简单标记,能否请您提出一种实现我的目标的方法?

编辑: 我正在添加视图。

def vote(request, slug):
    term = Term.objects.get(slug=slug)

    if term.votes.exists(user_id=request.user.id):
        term.votes.down(user_id=request.user.id)
    else:
        term.votes.up(user_id=request.user.id)

    return HttpResponseRedirect(term.get_absolute_url())

和型号:

class Term(VoteModel, models.Model):

为什么不将变量从视图传递到模板?例如,在视图上下文中,您可以设置自己的上下文变量,例如:

class MyView(generic.DetailView):

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        obj = self.get_object()
        is_user_voted_already = obj.votes.exists(user_id)
        context.update({
            'is_user_voted_already': is_user_voted_already
        })
        return context

您可以在模板视图中查看。就像这样:

{% if is_user_voted_already %}code here if user voted already{%else}code here user not voted already{%endif%}