$Django 站点:样式--文章--分类文章--文章详情--文章评论点赞--文章评论点赞统计(数据库优化)
<h3>个人站点下的</h3>
知识点
url (r'(?P<username>\w+)/p/(?P<id>\d+)', xiangxi,name='xxx'),#文章详情页面
url (r'dianzhan/', dianzhan), #文章详情中点赞的一个接收ajax请求路由
url (r'pinlun/', pinlun), #文章详情中评论的一个接收ajax请求路由
url (r'(?P<username>\w+)/(?P<n>a|b|c)/(?P<d>.*)', zhandian.as_view ()),#个人站点页面 分类页面
url (r'(?P<username>\w+)/', zhandian.as_view ()), #个人站点页面
1.样式
a.css
2.所有文章
class zhandian(View):
def get(self,request,username,*args,**kwargs):
username = username
user = models.User_info.objects.filter (username=username).first ()
blog = user.blog
wen=models.Wenzhang.objects.filter(blog=blog)
3.分类下的文章
人站点下的所有文章进行再次过滤
4.文章详情
5.文章评论点赞
#点赞注意问题:1 事物 2 一个用户只能点赞一次unique_together=('user_info','wenzhang')
def dianzhan(request):
dic = {'status': 100, 'msg': ''}
if request.user.is_authenticated ():
id = request.POST.get ('id')
x = models.Dianzan.objects.filter (user_info=request.user, wenzhang_id=id)
if x:
dic = {'status': 101, 'msg': '该用户已点击过'}
else:
is_up = request.POST.get ('is_up')
import json
is_up = json.loads (is_up)
from django.db import transaction
with transaction.atomic ():
models.Dianzan.objects.create (user_info=request.user, wenzhang_id=id, is_up=is_up)
# models.Dianzan.objects.filter(is_up=True).values('wenzhang').annotate(c=Count('wenzhang')).values('wenzhang','c')
# models.Dianzan.objects.filter(is_up=False).values('wenzhang').annotate(c=Count('wenzhang')).values('wenzhang','c')
if is_up == True:
models.Wenzhang.objects.filter (id=id).update (upnum=F ('upnum') + 1)
dic['msg'] = '点赞成功'
else:
models.Wenzhang.objects.filter (id=id).update (downnum=F ('downnum') - 1)
dic['msg'] = '点踩成功'
else:
dic['status'] = 101
dic['msg'] = '请先登录'
print (dic)
return JsonResponse (dic) #评论注意问题:1 安全的html文本通过过滤器 safe 可以不转义 显示优雅的页面 2 评论中的回复评论
#略
6.文章评论点赞统计
数据库优化:把这个连表查询得到的数据,直接写入文章表中,每次浏览器显示的数据直接从文章表中读取
class Wenzhang (models.Model):
id = models.AutoField (primary_key=True)
title = models.CharField (max_length=32)
category = models.ForeignKey (to='Category', to_field='id', null=True, blank=True)
blog = models.ForeignKey (to='Blog', to_field='id', null=True, blank=True)
content = models.TextField ()
desc = models.CharField (max_length=300)
create_time = models.DateTimeField (auto_now_add=True)
tag = models.ManyToManyField (to='Tag', through='Wen_Tag', through_fields=('wenzhang', 'tag'))
upnum=models.IntegerField(default=0)
downnum=models.IntegerField(default=0)
pinnum = models.IntegerField (default=0)
#往关联表中添加一条评论点赞数 通过事物文章表中更新增加1(用到F函数)
随机推荐
- golang命令行参数
os.Args获取命令行参数 os.Args是一个srting的切片,用来存储所有的命令行参数 package main import ( "fmt" "os" ...
- 【leetcode-84】 柱状图中最大的矩形
(1pass,比较简单的hard) 给定 n 个非负整数,用来表示柱状图中各个柱子的高度.每个柱子彼此相邻,且宽度为 1 . 求在该柱状图中,能够勾勒出来的矩形的最大面积. 以上是柱状图的示例,其中每 ...
- Shell编程(五)脚本语法
${}: 数据“内容”删除,替换:{}: 列表 1. 条件测试: test =~:正则匹配 2. if/then/elif/else/fi #!/bin/bash echo "Is it o ...
- redis基本操作
''' pip install redis redis 可以看成内存中的大字典 redis五大数据类型 --> 指的是第一层的value值的类型 - 字符串 "k1" - 列 ...
- DingDing的CorpSecretID和SSOSecret不是一个东西
今天客户更新系统后,提供了一对corpid和secret,结果同步钉钉考勤机数据时,一直提示corpid和secret不正确,最后询问钉钉官方人员发现,客户提供的是SSOSecret,应该使用Copr ...
- 符号执行-基于python的二进制分析框架angr
转载:All Right 符号执行概述 在学习这个框架之前首先要知道符号执行.符号执行技术使用符号值代替数字值执行程序,得到的变量的值是由输入变 量的符号值和常量组成的表达式.符号执行技术首先由Kin ...
- alexnet- tensorflow
alexnet 在 imagenet上夺冠是卷积神经网络如今这么火热的起点. 虽然卷积神经网络很早就被提出来,但是由于计算能力和各方面原因,没有得到关注. alexnet 为什么能取得这么好的成绩,它 ...
- 数据库设计理论与实践·<三>物理设计
一.物理设计核心任务与关键细节 二.物理设计经验之谈 1.数据类型的设计:建议字段数据类型定义时结合以下几点(以MYSQL为例) 1)不适用image,而使用varbinary等 2)不使用text和 ...
- Python之进程 2 - multiprocessing模块
我们已经了解了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创建的.因此,运行起来的python程序也是一个进程,那么我们也可以在程序中再创建进程.多个进程可以实现并发效果,也就是说, ...
- xenserver 上传centos6.8镜像
1.宿主机操作: # mkdir /iso # xe sr-create name-label=system-iso type=iso device-config:location=/iso de ...