一、点赞和踩灭

1、事务

事务:要么同时发生,要么同时不发生,文章点赞表增加一条数据的时候,对应的文章的点赞或者踩灭数加1,如果后面的if语句不能执行,则根据事务,点赞表也不会增加数据

from django.db import transaction                                                         #引入transaction事务

with transaction.atomic():
    obj = ArticleUpDown.objects.create(user_id=user_pk, article_id=article_id, is_up=is_up)    #文章点赞表里面添加一条数据
    if is_up:
        Article.objects.filter(pk=article_id).update(up_count=F("up_count") + 1)            #文章表相应的文章的点赞数加1
    else:
        Article.objects.filter(pk=article_id).update(down_count=F("down_count") + 1)       #文章表相应的文章的踩灭数加1


2、render方法

浏览器给服务器发送一个请求,视图函数从模板中取到html页面,如果页面里面有模板语法,如{{ }}、{% %},render方法会先对其进行渲染,将模板语法替换为相应的html标签,

最后将标签返回给浏览器,所以如果js在html页面,那么就可以使用模板语法,而如果将js单独做成一个静态文件,则不能使用模板语法。


3、点赞的视图函数和页面

views.py文件增加点赞视图:

import json
from django.http import JsonResponse
from django.db.models import F
from django.db import transaction
def digg(request):
    res={"state":True}                     #状态为true代表点赞,false为踩灭
    user_pk=request.user.pk                 # 当前登录用户,即点赞用户,request.user是全局变量
    article_id=request.POST.get("article_id")
    is_up=request.POST.get("is_up")             #因为js默认post是urlencode,发送的是字符串,所以这里接收到的就是字符串
    is_up=json.loads(is_up)                #将收到的字符串通过json序列化为我们需要的布尔值
    try:
        with transaction.atomic():          #事务
            obj=ArticleUpDown.objects.create(user_id=user_pk,article_id=article_id,is_up=is_up)
            if is_up:
                 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)
    except Exception as e:
        res["state"]=False                #变成踩灭状态
        res["first_action"]=ArticleUpDown.objects.filter(user_id=user_pk,article_id=article_id).first().is_up  #返回给ajax的数据多了first_action属性
    return JsonResponse(res)                   #返回给ajax的时候,ajax不用反序列化,接收到的是一个字典格式


article_detail.html页面:

{% extends "base.html" %}

{% block content %}
    {{ article_obj.title }}
    
        {{ article_obj.articledetail.content|safe }}
    
                                           {{ article_obj.up_count }}