如何在 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%}
我有一个自定义模板标签如下:
@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%}