Как вызвать функцию внутри оператора if в шаблоне Django - PullRequest
0 голосов
/ 05 января 2020

У меня есть пользовательский тег шаблона следующим образом:

@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? Например, почему я не могу использовать как:

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

Я использую django -вопрос [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):

1 Ответ

1 голос
/ 05 января 2020

почему бы не передать переменную из вида в шаблон? Например, внутри контекста представления вы можете установить собственную переменную контекста, например:

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