试图让Django和jQuery一起工作,通过“添加/删除书签”链接添加/删除书签

时间:2013-12-10 01:48:53

标签: jquery django

我正在通过构建一个简单的Q& A网站来学习Django。下面的模型,网址,视图和模板代码根据需要在数据库中添加/删除书签......

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>

如果我将模板标签修改为包含class =“add-remove-bookmark”,则此jQuery代码会切换“添加书签”和“删除书签”之间的链接。但是,一旦我将class =“”添加到标记中,单击链接就无法更新数据库。

jQuery:

    $(".add-remove-bookmark").click(function(e) {
        if ($(this).html() == "Add Bookmark") {
            $(this).html('Remove Bookmark');
        }
        else {
            $(this).html('Add Bookmark');
        }
        return false;
    });

最重要的是,我希望用户点击“添加书签”并让代码将书签添加到数据库并将链接切换为“删除书签”。反之亦然。我究竟做错了什么?感谢。

相关问题 - 我想我需要一种方法来测试 - 从我的模板中 - 如果一个问题的书签存在,那么我可以显示切换链接的正确初始值:即如果它不存在则添加,否则去掉。我试着想一个我可以添加到我的问题模型中的函数(例如Question.user_has_bookmarked),但是无法想出任何有效的函数。

1 个答案:

答案 0 :(得分: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变量来仅指向登录用户。这可以防止与共享链接等相关的一些不良行为。