@happiva

Как вызвать функцию в шаблоне?

Понимаю,что вопрос простой,но все же есть недопонимание
class CollDetailView(DetailView):
    model = Art
    template_name = 'art_detail.html'
    queryset = Art.objects.all_with_related_persons_and_score()

    def get_context_data(self, **kwargs):
        ctx = super().get_context_data()
        if self.request.user.is_authenticated:
            voted = Like.objects.get_vote_or_unsaved_blank_vote(
                author_by=self.request.user,
                art_ident=self.get_object()
            )
            if not voted and self.request.user.access_to_golos:
                obj = self.get_object()
                add_like(obj=obj, user=self.request.user)
       
        else:
            pass
        return ctx


Сама функция
def add_like(user, obj):
    obj_type = ContentType.objects.get_for_model(obj)
    like = Like.objects.get_or_create(
        content_type=obj_type, art_ident=obj.slug, author_by=user)
    return reverse('art_detail')


Может можно как-то вызов функции в в ctx засунуть ??А Если все же через reverse,то не подскажите как именно ее записать,потому что пробовал некоторым образом - не срабатывало
Заранее Спасибо,Вам
  • Вопрос задан
  • 1779 просмотров
Пригласить эксперта
Ответы на вопрос 2
@ilya_chch
если это система лайков, то я бы предложил написать простенький API эндпоинт, и JavaScript-ом отправлять туда POST запрос, в котором передавать id. если лайка нет и он успешно создался, API отдает статус 201 и что-нибудь типа {'like': 'OK'} и кнопка как-то изменяется. Если лайк был поставлен, лайк удаляется и возвращается статус 204 и ответ типа {'like': 'REMOVED'}.

ну а по поводу постановки вопроса - изначально под выполнение функции в шаблоне больше всего подходят шаблонные тэги. Но они выполняются во время рендеринга страницы.

если API - не ваш вариант, можно сделать RedirectView, а кнопку, которая должна выполнять эту функцию повесить ссылку на эту вьюху. в методе get_redirect_url пишешь свою логику и вертаешь тот же url, с которого пришло через request.META.HTTP_REFERER
Ответ написан
Комментировать
@szelga
можно запилить свой template tag, например. но присоединяюсь к предыдущим ораторам, это некрасиво, лучше отделять логику от представления.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы