2015-10-16 66 views
2

我堅持Raiting模型爲我的項目(問題答案網站,像stackoverflow)。我用Tango的這個guid和Django http://www.tangowithdjango.com/book17/chapters/ajax.html來添加像ajax一樣的按鈕。然後我決定爲喜歡和解決方案創建特殊模型。我不知道,我怎麼能做到這一點。所有的 首先,我嘗試這樣做評級模型Django

class Rating(models.Model): 

    user = models.ForeignKey(CustomUser) 
    answer = models.ForeignKey(Answer) 
    like = models.IntegerField(default=0) 
    resolve = models.IntegerField(default=0) 


url(r'add_like/(?P<answer_pk>[0-9]+)/$', views.add_like, name='add_like'), 


def add_like(request, answer_pk): 

    if request.POST: 
     ans_rait = Rating.objects.get(answer=answer_pk) 
     ans_rait.like += 1 
     ans_rait.save() 

    return redirect(reverse(get_question)) 

在我的問題頁面,我顯示循環模式問題和答案

{% for answer in answers %} 
    <div class="container-fluid no-padding"> 
     {{ answer.text }} 
    </div> 
    {% if user.is_authenticated %} 
     <form method = "post" action = "{% url 'add_like' %}"> 
     <button class="btn btn-default" type="submit"> like | {{ answer.rating.like }} 
     </button> 
    </form> 
    {% endif %} 

請至少提前瞭解將像循環的邏輯。我試過很多東西,但不知道如何做到這一點

更新我想用戶的「混合」的解決方案:
當我點擊喜歡按鈕,我有例外:「轉讓之前局部變量‘ans_rait’引用」 。
當我在瀏覽器控制檯發佈的js腳本,然後點擊,我有錯誤:
「未捕獲的ReferenceError:未定義csrfToken」
「POST http://127.0.0.1:8000/questions/add_like 500(內部服務器錯誤)」

我決定問題是在創建模型評價的,我試圖像這樣的更新視圖代碼:

def add_like(request): 

    if request.POST: 

     answer_pk = request.POST.get('answer_pk') 
     ans_author = Answer.objects.get(pk=answer_pk) 

     if Answer.objects.filter(answer=answer_pk) is None: 

      Rating.objects.create(user=ans_author.author, 
       answer=ans_author.id, like=1, resolve=0) 
      data = {'message': 'Success'} 

     else: 
      ans_rait = Answer.objects.get(answer=answer_pk) 
      ans_rait.like += 1 
      ans_rait.save() 
      data = {'message': 'Success'} 

    return JsonResponse(data) 

url: url(r'add_like$', views.add_like, name='add_like'), 

,我有例外:「答案符合查詢不存在」

我想,我在邏輯混淆了,現在看來最好的解決方案是在Answer模型中添加「like」和「solve」極點,然後通過AnswerModel中的喜歡和計算來計算用戶評分。現在,我的模型看起來像這樣:

class Answer(models.Model): 

    text = models.TextField() 
    date = models.DateTimeField(default=datetime.datetime.now) 
    author = models.ForeignKey(CustomUser) 
    question = models.ForeignKey(Question) 
+0

能否請你列出你已經嘗試過的東西?我認爲這個教程很清楚如何做到這一點:http://www.tangowithdjango.com/book17/chapters/ajax.html#ajax-based-functionality – user1797792

+0

我做了所有的指導,但我不喜歡它的方式循環工作。計數器在同一個按鈕上更新一次,在下一個,重新加載頁面之後更新,並且我的答案在重新加載後更改位置。我還沒有研究js,首先嚐試在django中構建這個解決方案。我認爲'喜歡'的特殊模型會更糟,如果我們發送數據,我們需要POST方法,不是嗎? –

回答

0
<form method = "post" action = "{% url 'add_like' %}"> 

應該是:

<form class="_addLike" data-answer-pk="{{ answer.pk }}" method="post" action="{% url 'add_like' %}"> 

所以現在準備AJAX(把這個在頁腳): $( '._ addLike') .on('submit',function(){ var $ this = $(this); var actionURL = $ this.attr('action'); var answerPK = $ this.data('answer-pk') ; $ .ajax({ type : 'POST', 網址:actionURL, 數據:{ 'answer_pk':answerPK, 'csrfMiddlewareToken':csrfToken}, 數據類型: '文本', 成功:函數(){ 警報( '成功'); }, error:function(){ alert('error'); } }) });

最後:

from django.http import JsonResponse 
def add_like(request): 
    if request.POST: 
     data = {'message': 'Success'} 
     answer_pk = request.POST.get('answer_pk') 

     try: 
      ans_rait = Rating.objects.get(answer=answer_pk) 
     except Rating.DoesNotExist: 
      data = {'message': 'Invalid rating obj'} 

     if ans_rait: 
      ans_rait.like += 1 
      ans_rait.save() 

    return JsonResponse(data) 
+0

謝謝!我會在其他解決方案之後嘗試。 JS對我來說很困難,我還沒有研究它 –

+0

**我試過你的解決方案,並且我有這個異常**:「在分配之前引用了局部變量'ans_rait'** **我在控制檯中發佈了js腳本並且看到了這個* *:「未捕獲ReferenceError:未定義csrfToken」POST 127.0.0.1:8000/questions/add_like 500(內部服務器錯誤)「**我認爲與模型評級有關的問題,數據庫collumns是空的,我們無法獲取數據,我試圖更新代碼如下:**'如果Answer.objects.filter(answer = answer_pk)是None:Rating.objects.create(answer = Answer.id,like = 1,resolve = 0)** **也許easer add poles「贊「和」解決「到我的」答案「模型?** –

+0

混合,我更新我的答案,謝謝你的幫助,我真的被困在這個問題。評價和喜歡是我的項目的最後一個大問題,我無法解決這就像4-5天,也許我只是不能完全向你解釋我的問題,如果你不明白的東西,我更新像你想要的問題 –

1

確定,所以要 '喜歡',而無需使用AJAX? 有一些東西錯了這條線:

<form method = "post" action = "{% url 'add_like' %}"> 

首先你不需要圍繞等號所有這些空間。而且你必須確定這個投票的答案,你必須把它放在URL中。所以:

<form method="post" action={% url 'add_like' answer.id %}"> 

這將生成的網址:add_like/23/例如,所以用ID =回答23將被更新 https://docs.djangoproject.com/en/1.8/ref/templates/builtins/#url

+0

謝謝你,它的工作原理,但我不明白我如何更新視圖?在我的數據庫評級表中,所有列都是空的,當我嘗試+ = 1喜歡我的模型時,我有錯誤「評級匹配查詢不存在」。我認爲問題與視圖 –

+0

更改'

'到' Hybrid

+0

我試着添加這個'if Answer.objects。過濾器(回答= answer_pk)是無: \t \t \t Rating.objects.create(用戶= Answer.author, \t \t \t \t答案= Answer.id,像= 1,解決= 0)''Answer.author'是ForeignKey到CustomUser模型 –