Django 项目试炼blog(6) -- 文章详情页1 -- 点赞功能

url

   #文章详情页
    re_path(r‘(?P<username>\w+)/article/(?P<article_id>\d+)/$‘,views.article),
    # 点赞
    path(‘up_down/‘, views.up_down),


views


from django.db.models import F
def up_down(request):
    sign = request.POST.get(‘sign‘)
    sign = json.loads(sign)  # 前端数据默认以json传来,将‘true’进换成布尔值
    article_id = request.POST.get(‘article_id‘)

    send_info = {‘state‘: True}
    obj = ArticleUpDown.objects.filter(article_id=article_id, user_id=request.user.pk).first()
    if not obj:
        ArticleUpDown.objects.create(is_up=sign, article_id=article_id, user_id=request.user.pk)
        if sign == True:
            Article.objects.filter(pk=article_id).update(up_count=F(‘up_count‘) + 1)
        else:
            Article.objects.filter(pk=article_id).update(down_count=F(‘down_count‘) + 1)
    else:
        send_info[‘state‘] = False  # 用户已对文章进行过操作
        send_info[‘handled‘] = obj.is_up  # 对文章的Up or Down操作
    print(send_info)

    return JsonResponse(send_info)


前端

        <div id="div_digg" class="pull-right">
            {#功能效果一样时,给与同一个类名进行jquery操作#}
            <div class="diggit action" >
                <span class="diggnum" id="digg_count">{{ art_obj.up_count }}</span>
            </div>
            <div class="buryit action" >
                <span class="burynum" id="bury_count">{{ art_obj.down_count }}</span>
            </div>
            <div><span class="up_down_info" style="color: red;margin-left: 10px"></span></div>
        </div>
        <div style="clear: both"></div>

Jquery

$(function () {
            {#点赞哪个用户对哪篇文章进行了点赞操作(用户即为登陆用户)#}
            $(‘.action‘).click(function () {
                var $obj = $(this).children(‘span‘);
                var sign = ‘‘;
                if($(this).children().attr(‘class‘)===‘diggnum‘){
                sign = true
                }
                else {
                    sign = false
                }
                {#在jQuery使用ajax后$(this)失效#}
                $.ajax({
                    url:‘/up_down/‘,
                    type:‘post‘,
                    data:{
                        ‘sign‘:sign,
                        ‘article_id‘:"{{ art_obj.pk }}",
                        ‘csrfmiddlewaretoken‘:$("[name=‘csrfmiddlewaretoken‘]").val()
                        },
                    success:function(data){
                        console.log(data);
                        {#判断用户是否已操作#}
                        if(data[‘state‘] === false){
                            if(data[‘handled‘]===true){
                                $(‘.up_down_info‘).text(‘你已经支持过‘);
                                setTimeout(function () {$(‘.up_down_info‘).text(‘‘)},1000)
                            }
                            else{
                                $(‘.up_down_info‘).text(‘你已经反对过‘);
                                setTimeout(function () {$(‘.up_down_info‘).text(‘‘)},1000)
                            }
                        }else{
                            nub = $obj.text();
                            $obj.text(parseInt(nub)+1)
                        }
                    }
                    })
                });


重点:

1、点赞框,反对框(因为功能一样)设置统一类名,在jquery事件中再判断“赞”与“反对”

2、前端ajax数据以json数据传输至后端,需要转序列

3、点赞数两种显示,ajax动态显示,render显示

原文地址:https://www.cnblogs.com/zhuzhiwei-2019/p/10776838.html

时间: 2024-11-08 16:59:38

Django 项目试炼blog(6) -- 文章详情页1 -- 点赞功能的相关文章

Django 项目试炼blog(8) -- 评论树的显示

Views def get_tree_data(request): article_id = request.GET.get('article_id') send_data = list(Comment.objects.filter(article_id=article_id).values('pk','content','parent_comment_id')) return JsonResponse(send_data,safe=False) ORM生成的的是queryset对象,而非真正的

Django 项目试炼blog(7) -- 文章详情页2 -- 前端样式的继承与楼评论显示

views from django.db import transaction def comment(request): article_id = request.POST.get('article_id') content = request.POST.get('content') pid = request.POST.get('parent_id') #事务操作 生成评论,文章数据中评论总数自动+1(同时执行) with transaction.atomic(): comm_obj = C

django 项目试炼blog(1)

1.确定表结构 from django.contrib.auth.models import AbstractUser class UserInfo(AbstractUser): """ 用户信息表, 继承session生成的auth_user表 需要在setting中加入 AUTH_USER_MODEL = 'app01.UserInfo' """ nid = models.AutoField(primary_key=True) telepho

Django 项目试炼blog(10) --补充 滑动验证码

首先安装一个需要用到的模块 pip install social-auth-app-django 安装完后在终端输入pip list会看到 social-auth-app-django 3.1.0 social-auth-core 3.0.0 然后可以来我的github,下载关于滑动验证码的这个demo:https://github.com/Edward66/slide_auth_code 下载完后启动项目 python manage.py runserver 启动这个项目后,在主页就能看到示例

Django 项目试炼blog(9) -- 文本编辑器的使用(文件存储,预览)

HTML <div class="col-md-9"> <div> <p class="text-center" style="background-color: #e5eef7;font-size: 18px" >添加文章</p> <form action="" method="post" style="margin-top: 40px&qu

6 功能4:文章详情页

1.文章详情页的设计 # 文章详情页 re_path(r'^(?P<username>\w+)/articles/(?P<article_id>\d+)$', views.article_detail, name='article_detail'), 2.文章详情页的数据构建 def article_detail(request, username, article_id): """文章详情页""" user_obj =

文章详情页

一.文章详情页访问设计 访问文章详情页,访问文章路径类似:https://www.cnblogs.com/wupeiqi/articles/3148888.html 参照访问路径编写文章详情页路由如下: urlpatterns = [ ... # 文章详情页 re_path('^(?P<username>\w+)/articles/(?P<article_id>\d+)$', views.article_detail), ] 二.文章详情页的数据构建 文章详情页的head部分和左侧

BBS - 文章详情页

一. 文章详情页的设计和数据构建 url.py # 文章详情页 re_path('^(?P<username>\w+)/articles/(?P<article_id>\d+)$', views.article_detail), # \w+:数字和字母 views.py def get_query_data(username): # 查询相关的数据,获取分类的数据 ''' 由于数据很多个地方需要用到,所以可以解耦出来,单独写一个函数 :param username: :return

博客2.0--第一版文章详情页留念

新版文章详情页>>http://blog.51cto.com/itstyle/2127815 原文地址:http://blog.51cto.com/51ctoblog/2129401