0

我正在使用媒体服务器,每个视频旁边都会有一个小星星。一个 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 层(登录后用户名显示在标题的右上角),但这仍然不能解决我这样做的问题正确地,同时将我的脚本与我的模板分开。

4

1 回答 1

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

于 2013-06-20T21:51:02.120 回答