0

我试图研究,但找不到在 Django 中使用 Ajax 处理 META 请求的方法。每次刷新页面都会破坏用户体验。所以如果代码是这样的:

模板

<a href="/like/?id={{ car.id }}" ># of likes: {{ car.likes }}</a>

视图.py

def like_page(request):
    if 'id' in request.GET:
        id = request.GET['id']
        car = Cars.objects.get(id=id)
        car.likes += 1
        car.save()
    if 'HTTP_REFERER' in request.META:
        return HttpResponseRedirect(request.META['HTTP_REFERER'])
    return HttpResponseRedirect('/')

所以模板发送对象的id,并且在视图中它增加1。每次发生这种情况。现在的问题是,如果没有 Ajax,它会在每次发生时重新加载页面。我是一名后端开发人员,所以我几乎没有使用 jQuery 和 Ajax 的经验,所以我不知道如何解决这个问题。

任何帮助,将不胜感激。谢谢 :)

4

1 回答 1

1

做到这一点的方法是应用渐进式开发——让非 js 工作,然后在此之上使用 ajax 或您想要的任何其他客户端技术进行增强。

Djangorequestis_ajax( docs ) 方法,这对于渐进式开发非常有用。这个想法是,当请求是非 ajax 时,做你之前做过的任何事情,但是如果是 ajax,则返回 like 计数器,以便 js 可以更新页面:

def like_page(request):
    if 'id' in request.GET:
        id = request.GET['id']
        car = Cars.objects.get(id=id)
        car.likes += 1
        car.save()

    if not request.is_ajax():
        if 'HTTP_REFERER' in request.META:
            return HttpResponseRedirect(request.META['HTTP_REFERER'])
        else:
            return HttpResponseRedirect('/')
    else:
        data = {
            'likes': car.likes
        }
        json_data = json.dumps(data)
        return HttpResponse(json_data, content_type='application/json')

请注意,这会返回 json 数据。这非常有用,因为它在将来很容易扩展,以防您必须返回其他信息。

现在对于 js/jquery 的东西:

模板

<a id="car_like" href="/like/?id={{ car.id }}" >
    # of likes: 
    <span id="car_like_count">{{ car.likes }}</a>
</a>

JS

$(document).ready(function () {
    $('#car_like').click(function(event) {
        event.preventDefault();
        var car_like = $(this),
            url = car_like.attr('href');
        $.getJSON(url, function(data) {
            $('#car_like_count', car_like).html(data.likes);
        });
        return false;
    });
});

这将覆盖 like 锚的默认行为,并发送 ajax 请求。Ajax 请求将为汽车返回一个新的类似计数器,js 将显示该计数器以代替旧数字。但是,如果由于某种原因不支持 js,则会发生默认操作,并且 like 锚仍然可以工作。

于 2012-10-15T05:36:40.143 回答