【问题标题】:How to call function within if statement in Django template如何在Django模板中的if语句中调用函数
【发布时间】:2020-04-23 07:15:21
【问题描述】:

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

@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)

然后我可以在模板(基于类的详细视图)中调用它,如下所示。

{% 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]

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

如果不能在 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):

【问题讨论】:

    标签: django templates templatetags


    【解决方案1】:

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

    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%}
    

    【讨论】:

    • Ammad,起初忽略了你的回答。它确实有效。将 user_id 更改为 self.request.user.id。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    • 2020-03-07
    • 2013-10-17
    • 1970-01-01
    • 2015-05-14
    相关资源
    最近更新 更多