Django 博客文章详情页面 点赞功能案例

使用技术
利用Ajax点赞 并 局部刷新页面
绑定事件 点赞和绑定 灵活处理
利用F 页面局部刷新 点赞数
反序列json获取布尔值
视图
布尔值,必须用Json反序列化才能使用
F的妙用 点赞数自加1
def digg(request):

# ajax 是json格式,特殊情况下需要反序列
import json
from django.db.models import F  # 利用F来做自加1操作

article_id = request.POST.get('article_id')

is_up = json.loads(request.POST.get('is_up'))  # 必须反序列化才能为布尔值
# 点赞人即当前登陆人
user_id = request.user.pk

# 过滤已经点赞或者踩了的
obj = models.ArticleUpDown.objects.filter(user_id=user_id, article_id=article_id).first()

# 返回json
response = {'state': True, 'msg': None}

if not obj:
    ard = models.ArticleUpDown.objects.create(user_id=user_id, article_id=article_id, is_up=True)
    # 生成了赞记录, 然后再来更新页面
    if is_up:  # 如果是赞就更新赞
        models.Article.objects.filter(pk=article_id).update(up_count=F('up_count')+1)
    else:
        # 踩的时候
        models.Article.objects.filter(pk=article_id).update(down_count=F('down_count')+1)
else:
    response['state'] = False
    response['handled'] = obj.is_up  # 将已经做过的操作提示

return JsonResponse(response)  # 必须用json返回

点赞板块HTML
Ajax局部刷新功能

{% extends ‘base.html’ %}

{# 继承公共部分 #}

{% block content %}
{% csrf_token %}

{{ article_obj.title }}



{{ article_obj.content|safe }}



{{ article_obj.up_count }}{# 动态获取点赞数 #}


{{ article_obj.down_count }}



{# 您已经推荐过#}

    <script>
        {# 点赞和踩 ,两个标签加上action  is_up为布尔值 #}
        $('#div_digg .action').click(function () {
            var is_up = $(this).hasClass('diggit')
            {# ajax来操作点赞功能 #}
            $.ajax({
                url: '/digg/',
                type: 'post',
                data: {
                    'csrfmiddlewaretoken': $("[name='csrfmiddlewaretoken']").val(),  //token值
                    'is_up': is_up,
                    'article_id': '{{ article_obj.pk }}',
                },
                success: function (data) {
                    if (data.state) {
                        // Ajax 局部刷新!!!

                        // 判断是否是点赞
                        if(is_up){
                            var val = parseInt($('#digg_count').text());
                            $('#digg_count').text(val+1)
                        }else{
                            var val = parseInt($('#bury_count').text());
                            $('#bury_count').text(val+1)
                        }

                    }
                    else {
                        if (data.handled) {
                            $('#digg_tips').html('你已经推荐过')
                        } else {
                            $('#digg_tips').html('你已经反对过')
                        }
                        setTimeout(function () {  // 设置时钟函数,一秒钟后消失
                            $('#digg_tips').html('')  //清空
                        }, 1000)

                    }
                }
            })
        })

    </script>

</div>

{% endblock %}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值