2016-01-23 39 views
1

我遵循Tango和Django的教程來添加類似按鈕。我認爲它的工作,但它似乎只爲列表中的第一個模型實例工作。你看,我有一個視圖,其中顯示了列表中的所有對象。我的代碼如下所示:爲什麼我的按鈕只能在Django的列表的第一個實例上工作?

views.py

def content_list(request): 
    posts = Post.objects.all() 
    return render(request, 'app/content_list.html', {'posts' : posts}) 

models.py

class Post(models.Model): 
    user = models.ForeignKey(User, related_name = 'user_posts') 
    title = models.CharField(max_length = 140) 
    votes = models.IntegerField(default = 0) 

content_list.html - 模板

{% for post in posts %} 
    <h1>{{post.title}}</h1> 
    <p><strong id="like_count">{{post.votes}}</strong> points</p> 
    {% if request.user.is_authenticated %} 
     <button id="likes" data-post-id="{{post.id}}" class="btn btn-purple" type="button"> 
      <span>Upvote</span> 
     </button> 
    {% endif %} 
{% endfor %} 

views.py,我有處理後的喜好另一個功能:

@login_required 
def like_post(request): 
    post_id = None 

    # Getting the id of the post from the template 
    if request.method == 'GET': 
     post_id = request.GET['post_id'] 

    likes = 0 

    if post_id: 
     post = Post.objects.get(id = int(post_id)) 
     if post: 
      likes = post.votes + 1 
      post.votes = likes 
      post.save() 

    return HttpResponse(likes) 

最後,來完成實際的工作我的AJAX文件:

$('#likes').click(function(){ 
    var p_id; 
    p_id = $(this).attr("data-post-id"); 
    $.get('/like_post/', {post_id: p_id}, function(data){ 
     $('#like_count').html(data); 
     $('#likes').hide(); 
    }); 
}); 

urls.py我的應用程序文件夾中含有URL模式下面一行:

# Liking a post 
url(r'^like_post/$', views.like_post, name='like_post'), 

我缺少什麼?其他帖子的連根按鈕也不會隱藏,因爲我的ajax代碼,它們應該是這樣。我該如何解決這個問題?

謝謝!

+1

你應該使用,而不是ID –

+0

@whitelettersinblankpapers類:其中我應該用類替換id,爲什麼?你能詳細解釋一下嗎? –

+1

您正在使用循環來創建具有相同'id'的HTML元素(按鈕)。所以當你選擇使用jQuery時,你會得到一個只表示第一個元素的對象(因爲id是用作唯一標識符屬性)。在使用類時,jQuery將返回具有className的所有元素的集合。 –

回答

1

通過應用什麼在評論mentionned,您的服務器代碼將變成:

{% for post in posts %} 
    <h1>{{post.title}}</h1> 
    <p><strong id="like_count">{{post.votes}}</strong> points</p> 
    {% if request.user.is_authenticated %} 
     <button data-post-id="{{post.id}}" class="likes btn btn-purple" type="button"> 
      <span>Upvote</span> 
     </button> 
    {% endif %} 
{% endfor %} 

現在的JavaScript部分是:

$('.likes').click(function(){ 
    var p_id; 
    p_id = $(this).attr("data-post-id"); 
    $.get('/like_post/', {post_id: p_id}, function(data){ 
     $('#like_count').html(data); 
     $(this).hide(); 
    }); 
}); 
+0

我很抱歉,但這不起作用。首先,like_count不會更新第二次投票。 –

+1

嗯,這真的是一個單獨的問題,但請給我一些時間,我會在幾分鐘後回來試圖找出 –

+0

嗯,我認爲你應該這樣做like_count,替換類名稱,但這次你應該也' $('。like_count')。html(data);'帶有一個只針對同級項目的jQuery選擇,像'$(this).prevAll(「。like_count:first」);' –

相關問題