$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函数)
随机推荐
- 解析ArcGis的字段计算器(二)——有玄机的要素Geometry属性,在属性表标记重复点线面
这里所说的重复是指完成重复的,不是叠在一起的两个或多个要素,这种应该叫做“压盖”或“重叠”.重复往往是在合并多Shpfile文件时不小心重复导入造成的. 这里提供一种可能的解决办法,数据无价,请备份! ...
- redis的持久化方案
Redis的高性能是由于其将所有数据都存储在了内存中,为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中同步到硬盘中,这一过程就是持久化. Redis支持两种方式的持久化,一种是RDB方 ...
- 十一、移植优化---CONFIG 优化进 menuconfig(2)
11.3 jz2440.h 中的剩余宏移植 11.3.1 CONFIG_SYS_TEXT_BASE CONFIG_SYS_TEXT_BASE:设置系统代码段的基地址,设为 0x0:menuconfig ...
- vs不自动退出控制台程序的办法
1.在主函数rerurn 前加上getchar();即可. 2.ctrl+F5;
- html5 area实例
真实页面效果:就是一张图 html代码: <!DOCTYPE HTML> <html> <style> body{ padding:0px; margin:0px; ...
- Java SE之正则表达式三:替换
/** * * @author Zen Johnny * @date 2018年4月29日 下午4:31:07 * */ package demo.regex; public class RegexR ...
- MongoDB初探-基本语句和数据结构
MySQL: 1 金老板 18 15512351234 2 小哪吒 20 15312341234 3 Alex 73 15512341234 MongoDB: { { id : 1, name:金老板 ...
- Elasticsearch 5.0 —— Head插件部署指南(Head目前支持5.0了!请不要看本篇文章了)
使用ES的基本都会使用过head,但是版本升级到5.0后,head插件就不好使了.下面就看看如何在5.0中启动Head插件吧! Head目前支持5.0了!请不要看本篇文章了 Head目前支持5.0了! ...
- day 12 - 1 装饰器进阶
装饰器进阶 装饰器的简单回顾 装饰器开发原则:开放封闭原则装饰器的作用:在不改变原函数的调用方式的情况下,在函数的前后添加功能装饰器的本质:闭包函数 装饰器的模式 def wrapper(func): ...
- Javascript入门(四)条件控制语句
一.条件控制语句 1. if <script type="text/javascript"> var num = 1 if( num == 3 ){ alert(&qu ...