在Django中单击收藏夹星后,将用户重定向到登录页面

时间:2013-06-20 21:36:31

标签: jquery django login

我正在使用媒体服务器,每个视频旁边都会有一颗小星星。 JQuery事件处理程序附加到按钮,因此单击该按钮将导致向服务器的收藏页面发送AJAX POST请求,并发送要收藏的视频的唯一ID。然后,JQuery将切换图像(如果没有收藏,点击将使星形“发光”,如果被收藏,点击将使星形再次透明)。

如果用户未登录,他们显然无法收藏视频。我希望用户在单击“收藏夹”按钮时重定向到登录页面。但是,AJAX响应意味着从未经过身份验证的用户点击收藏按钮将切换收藏夹按钮图像,这不应该发生。问题是,我不知道如何将JQuery函数短路并根据用户的登录状态阻止切换。

以下是我的收藏页面,其中提交了POST请求。

@login_required
def favorite(request):
    if request.POST.has_key('id'):
        id = request.POST['id']
        id = id.rsplit('_')
        id = int(id[1])
        m = Media.objects.get(pk=id)
        m.favorited_by.add(request.user.get_profile())
        m.save()
    if request.META.has_key('HTTP_REFERRER'):
        return HttpResponseRedirect(request.META['HTTP_REFERRER'])
    return HttpResponseRedirect('/')

和JQuery

var imgSRC={'src1':'/static/images/star_off.png','src2':'/static/images/star_on.png'};
$('.favorites').live('click', function() {
    var img=$(this);
    id=$(this).parent().parent().attr('id');
    console.log(id);
    $.post('/favorite/', {"id": id}, function(data) {
        img.attr('src', imgSRC.src2);
        img.attr('class', 'favorites_on');
    });
});

编辑:

我更喜欢将javascript保留在自己的文件中,而不是将javascript嵌入到django模板中。因此,我将无法使用模板标记进行用户身份验证。我想到的一个解决方案是搜索仅在用户登录时才存在的唯一div层(登录后用户的名称显示在标题的右上角),但这仍然无法解决我这样做的问题正确地,同时保持我的脚本与我的模板分开。

1 个答案:

答案 0 :(得分:4)

我会在你的模板中使用is_authenticated方法:

$('.favorites').live('click', function() {
    {% if request.user.is_authenticated %}
       //user is logged in, let's go!
       var img=$(this);
       id=$(this).parent().parent().attr('id');
       console.log(id);
       $.post('/favorite/', {"id": id}, function(data) {
           img.attr('src', imgSRC.src2);
           img.attr('class', 'favorites_on');
       });
    {% else %}
       //not logged in, redirect to login page!
       window.location = "{% url your_login_url %}"; //what you named your login url in urls.py
    {% endif %}
});

更新

您可以将用户的状态发送到外部JS文件,如下所示:

<!-- end of body -->
<script>
USER_STATUS = {{ request.user.is_authenticated }}; //normally true/false
LOGIN_URL = '{% url your_login_url %}'; //what you named your login url in urls.py
</script>
在你的JS文件上放置以下行:

USER_STATUS = '';
LOGIN_URL = ''; // You'll never know when it changes ;)

然后

$('.favorites').live('click', function() {
    if(USER_STATUS==true){
       //user is logged in, let's go!
       var img=$(this);
       id=$(this).parent().parent().attr('id');
       console.log(id);
       $.post('/favorite/', {"id": id}, function(data) {
           img.attr('src', imgSRC.src2);
           img.attr('class', 'favorites_on');
       });
    } else {
       //not logged in, redirect to login page!
       window.location = LOGIN_URL; 
    }
});

我测试了javascript部分,但没有django。但我认为这会让你开始。

更新2

我在<script>

中使用了这个
{% if request.user.is_authenticated %} USER_STATUS = 'true';{% else %} USER_STATUS =  'false';{% endif %}
 alert(USER_STATUS);

并提醒true