2017-01-18 4 views
1

Я создаю систему комментариев и хочу реализовать upvoting/downvoting, аналогично SO и reddit. Мой вопрос в том, как именно я могу обнаружить щелчок по моему upvote или downvote img и вызвать функцию из django? Или есть другой способ обойти это? Вот мой код:Как вызвать метод django из шаблона без использования формы?

шаблона

... 

<div class="vote_div"> 
    <img src="upvote.png" class="upvote" /> 
    <img src="downvote.png" class="downvote" /> 
</div> 

... 

models.py

class Comments(models.Model): 

    ... 

    #score 
    upvotes = models.IntegerField(default=0) 
    downvotes = models.IntegerField(default=0) 

Я хочу, чтобы вызвать функцию в моем views.py для обработки голоса, но, как я сказал Я не знаю, как это сделать. Поскольку я знаю, что невозможно вызвать функцию django из js/jquery. Есть идеи?

ответ

2

Я собираюсь ответить на ваш вопрос, но сначала вы действительно об этом немного ошибаетесь. То, как вы структурировали это, не так хорошо, как полиция, сколько раз человек голосует. Даже если люди никогда не преднамеренно играют в эту игру, неизбежно возникнут проблемы, которые заставляют людей голосовать за что-то несколько раз.

В идеале, создать вторую таблицу, как это (предполагается, что вы только опрос зарегистрированных пользователей):

class Vote(models.Model): 
    user = models.ForeignKey("User") 
    comment = models.ForeignKey("Comments") 
    score = models.IntegerField(default=0) 

Тогда вы бы кнопка, которая представляет простой один вид поля формы с +1 или - 1. «Счет» был бы простой суммой, или вы могли бы считать положительные и отрицательные значения, чтобы получить значение для количества оборотов или вниз.

Если это приложение любого значения, вы должны использовать REST api (мне нравится Tastypie, но есть и другие). Это немного похожее на отказ от первого API, но не так уж плохо, и стоит инвестировать, если ваше приложение не станет простым.

Итак, наконец ... мертвый простой способ взломать/проколоть, чтобы сделать это. Вам не нужна форма, просто использовать generic View

Добавьте к этому urls.py с URL вроде нормально с comment_id как kwarg

url(r'^vote/(?P<comment_id>\d+)/$', BoneheadView.as_view(), name='comments-vote'), 

В views.py:

class BoneheadView(View): 
    def post(self, comment_id): 
     if "vote" in self.request.POST: 
      vote = int(self.request.POST["vote"]) 
      if vote_score in (-1, 0, 1): 
       # Do something to save your vote here like: 
       (vote,created) = Vote.objects.get_or_create(comment_id=comment_id) 
       vote.score = vote_score 
       vate.save() 
       return HttpResponse("Yay, a Vote") 
      else: 
       return HttpResponse("Invalid Vote", status=400) 
     else: 
      return HttpResponse("Invalid Vote", status=400) 

Наконец, на странице: Пересмотренный HTML

<div class="vote_div"> 
    <a href="{% url 'comments-vote' comment.id %}" data-score="1" class="vote"><img src="upvote.png" /></a> 
    <a href="{% url 'comments-vote' comment.id %}" data-score="-1" class="vote"><img src="downvote.png" /></a> 
</div> 

(Put это право Перед </body> на странице)

<script> 
$(".vote").click(function() { 
    var element = $(this); // grab the object that triggered the event 
    $.post(element.attr('href'), { score: element.data('score')}); 
    return false; 
}) 
</script> 
+1

Спасибо, я не думал о вложении 'img' в' Ā' тега, так что должно работать. Что касается моделей, я не слишком хорошо знаком с ForeignKey, но я просмотрел документацию, и я не могу найти «ForeignKeyField». Вы имели в виду писать ForeignKey или это другой синтаксис? И что же делает REST API, которого я уже не могу? Или что это делает проще? – Zorgan

+1

Это ForeignKey ... вот что происходит, когда вы закодируете из памяти и не имеете проверки кода. Если вы просто делаете одну или две вещи вроде этого, REST API, вероятно, слишком переполнен, но неплохо привыкнуть делать «правильную вещь». API REST позволяет вам создавать гораздо больше функциональности и более структурирован и стандартизован.Чем больше функций вы создадите в своем смешанном приложении javascript/django, тем больше вы оцените стандартизированный способ обмена данными между ними. –

Смежные вопросы