2013-12-10 45 views
0

我正在通過構建一個簡單的Q &網站來學習Django。下面的模型,網址,查看和模板的代碼添加所需/從數據庫刪除書籤...試圖讓Django和jQuery一起通過「添加/刪除書籤」鏈接添加/刪除書籤

Model: 

class Bookmark(models.Model): 
    user = models.ForeignKey(User) 
    question = models.ForeignKey(Question) 

Url: 

url(r'^add_remove_bookmark/(\d+)/(\d+)/$', views.add_remove_bookmark), 

View: 

@login_required 
def add_remove_bookmark(request, uid, qid): 
    try: 
     bookmark = Bookmark.objects.get(user=uid, question=qid) 
     bookmark.delete() 
    except Bookmark.DoesNotExist: 
     bookmark = Bookmark.objects.create(
         user=User.objects.get(id=uid), 
         question=Question.objects.get(id=qid)) 
     bookmark.save()  
    return HttpResponseRedirect('/qa/answers/' + qid) 

Template: 
<a href="/qa/add_remove_bookmark/{{ user.id }}/{{ question.id }}/">Add Bookmark</a> 

這jQuery代碼切換之間的「添加書籤」和「刪除書籤」如果我修改我的模板標籤鏈接包括class =「add-remove-bookmark」。但是,一旦我將class =「」添加到標記,單擊鏈接無法更新數據庫。底線,我希望用戶點擊「添加書籤」並讓代碼將書籤添加到數據庫並將鏈接切換到「刪除書籤」。反之亦然。我究竟做錯了什麼?謝謝。

相關問題 - 我想我需要一種方法來測試 - 從我的模板中 - 如果書籤存在的問題,所以我可以顯示正確的初始值爲切換鏈接:即添加如果它不存在,否則刪除。我試圖想到一個函數,我可以添加到我的問題模型(例如Question.user_has_bookmarked),但不能提出任何有用的東西。

+0

出現什麼錯誤? – alexander

回答

0

您的點擊處理程序結束時的return false;聲明會阻止瀏覽器實際跟蹤鏈接。刪除這應該允許您的點擊按照鏈接並按預期擊中您的視圖。

爲了測試書籤是否存在,您可以在視圖中使用類似Bookmark.objects.filter(user=request.user, question__id=quid).exists()的調用,該調用呈現相關模板並將返回的值作爲bookmark_exists傳遞給模板。這將允許你做下面的模板:

<a href="/qa/add_remove_bookmark/{{ user.id }}/{{ question.id }}/">{% if bookmark_exists %}Remove{% else %}Add{% endif %} Bookmark</a> 

一對夫婦的旁註:

  • 代碼在這裏使用GET要求修改數據。在這種情況下,在語義上使用POSTDELETE會更正確,因爲這些動詞與您期望完成的操作相對應。有關在這些情況下值得了解的HTTP方法列表,請參閱this wikipedia entry

  • 所示的視圖將允許任何用戶爲任何用戶創建或刪除書籤。最有可能的情況是,它應該使用request.user變量來僅引用已登錄的用戶。這將防止一些與共享鏈接相關的不良行爲等。

+0

非常有幫助。我刪除了返回false並將變量bookmark_exists添加到我的answers.html視圖中(因爲添加/刪除書籤從answers.html中調用)。這允許我顯示正確的鏈接文本(添加或刪除)。所以這兩個改變都是按照我的希望工作的。我還根據您的建議合併了request.user,以確保用戶只能添加/刪除自己的書籤。我將研究POST和DELETE並相應地調整我的視圖。 – user2916527