zoukankan      html  css  js  c++  java
  • day69BBS

     切日期:
                        from django.db.models.functions import TruncMonth
                        Sales.objects
                        .annotate(month=TruncMonth('timestamp'))        #创建month列,列下面放切好的时间
                        .values('month')                                #以month分组
                        .annotate(c=Count('id'))                        #以id计数
                        .values('month', 'c')                           #显示month和id数据
    
     url设计:
                有原来的三条变成一条了
                后端视图的形参利用* **来兼容
                    # url(r'^(?P<username>w+)/(?P<category>category)/(?P<param>d+)/',views.site),
                    # url(r'^(?P<username>w+)/(?P<tag>tag)/(?P<param>d+)/',views.site),
                    # url(r'^(?P<username>w+)/(?P<archive>archive)/(?P<param>w+)/',views.site),  
        
                    url(r'^(?P<username>w+)/(?P<condition>category|tag|archive)/(?P<params>.*)/',views.site),
            
        
        
        
     自定义inclusion_tag:
            原理:
                调用标签 传入参数 触发自定义函数提代码运行 将函数返回值传个另外页面 渲染完毕之后 再展示到调用该函数的位置
            
            1.在应用下新建一个名字必须叫templatetags的文件夹
            2.在该文件夹下新建一个任意名的py文件
            3.在该文件中固定写以下局势
                from django.template import Library                     
                register = Library()
            4.利用django提供的好的装饰器 
                @register.inclusion_tag('login.html')
            5.HTML中:
                {% load my_tag %}
                {% left_menu username %}
                
     前后端取消转义:
                前端 |safe
            
                from django.utils.safestring import mark_safe
                后端 mark_safe('<a>我是a</a>')

    HTML

    {% extends 'base.html' %}
    
    
    {% block css %}
        <style>
            #div_digg {
                float: right;
                margin-bottom: 10px;
                margin-right: 30px;
                font-size: 12px;
                width: 128px;
                text-align: center;
                margin-top: 10px;
            }
    
            .diggit {
                float: left;
                width: 46px;
                height: 52px;
                background: url('/static/image/upup.gif') no-repeat;
                text-align: center;
                cursor: pointer;
                margin-top: 2px;
                padding-top: 5px;
            }
    
            .buryit {
                float: right;
                margin-left: 20px;
                width: 46px;
                height: 52px;
                background: url('/static/image/downdown.gif') no-repeat;
                text-align: center;
                cursor: pointer;
                margin-top: 2px;
                padding-top: 5px;
            }
    
            .clear {
                clear: both;
            }
    
            .diggword {
                margin-top: 5px;
                margin-left: 0;
                font-size: 12px;
                color: gray;
            }
        </style>
    {% endblock %}
    
    {% block content %}
        <h1>{{ article_obj.title }}</h1>
        {{ article_obj.content|safe }}
        {#    点赞点踩前端样式#}
        <div>
            <div id="div_digg">
                <div class="diggit action" >
                    <span class="diggnum" id="digg_count">{{ article_obj.up_num }}</span>
                </div>
                <div class="buryit action">
                    <span class="burynum" id="bury_count">{{ article_obj.down_num }}</span>
                </div>
                <div class="clear"></div>
                <div class="diggword" id="digg_tips">
                    <span style="color: red" id="id_info"></span>
                </div>
            </div>
        </div>
        <script>
            $('.action').click(function () {
                var isUp = $(this).hasClass('diggit');
                var $spanEle = $(this).children();
                $.ajax({
                    url:'/up_or_down/',
                    type:'post',
                    data:{'is_up':isUp,'article_id':{{ article_obj.pk }},'csrfmiddlewaretoken':'{{ csrf_token }}'},
                    success:function (data) {
                        if (data.code == 2000){
                            $('#id_info').html(data.msg);
                            $spanEle.text(Number($spanEle.text()) + 1);                            #前端点赞点踩显示效果+1
                        }else{
                            $('#id_info').html(data.msg)
                        }
                    }
                })
            })
        </script>
    {% endblock %}

    views

    from django.db.models import Count
    def site(request,username,*args,**kwargs):
        user_obj = models.Userinfo.objects.filter(username=username).first()
        if not user_obj:                                                # 当用户不存在的时候返回404页面
           
            return render(request,'error.html')
        blog = user_obj.blog
        username = user_obj.username
        article_list = models.Article.objects.filter(blog=blog)         # 当前用户所有的文章
        
        if kwargs:                                                      # 判断kwargs是否有值 如果有值  你一个对上面的article_list再做一层筛选
            condition = kwargs.get('condition')
            params = kwargs.get('params')
            if condition == 'category':
                article_list = article_list.filter(category_id=params)
            elif condition == 'tag':
                article_list = article_list.filter(tag__id=params)
            elif condition == 'archive':
                # 2018-1
                year,month = params.split('-')
                article_list = article_list.filter(create_time__year=year,create_time__month=month)
                
                
        """侧边渲染相关"""
       
        
        category_list = models.Category.objects.filter(blog=blog).annotate(c=Count('article__id')).values_list('category_name','c','pk')                       # 查询当前用户每一个的分类及分类下的文章数
      
    
      
        tag_list = models.Tag.objects.filter(blog=blog).annotate(c=Count('article')).values_list('tag_name','c','pk')                                           # 查询当前用户每一个标签及标签下的文章数
     
    
        date_list = models.Article.objects.filter(blog=blog).annotate(month=TruncMonth('create_time')).values('month').annotate(c=Count('pk')).values_list('month','c')  # pk:会自动帮你查找到当前表的主键字段
        
      
        return render(request,'site.html',locals())
    
    
    def article_detail(request,username,article_id):
        article_obj = models.Article.objects.filter(pk=article_id).first()
        blog = article_obj.blog
        return render(request,'article_detail.html',locals())
        
    
    import json
    def up_or_down(request):
        
      
        back_dic = {"code":None,'msg':''}
        if request.is_ajax():
            is_up = request.POST.get('is_up')                                               # 你拿到的是js格式的布尔值 对应到python里面就是字符串
            is_up = json.loads(is_up)                                                       # 利用json模块 将字符串形式转成python里面的布尔值
            
            article_id = request.POST.get('article_id')           
          
            if request.user.is_authenticated():                                             # 1.先判断用户是否登陆
               
                article_obj = models.Article.objects.filter(pk=article_id).first()   
                if article_obj:                                                             # 2.判断当前文章是否就是当前用户写的
                    if not article_obj.blog.userinfo.pk == request.user.pk:
                    
                       
                        is_click = models.UpAndDown.objects.filter(user=request.user,article=article_obj)
                        if not is_click:                                                     # 3.判断当前文章是否已经被当前用户点过了
                           
                            if is_up:                                                        # 4.记录数据  1.到底是点赞还是点踩  2.两张表里面同步记录
                                models.Article.objects.filter(pk=article_id).update(up_num = F('up_num') + 1)
                            else:
                                models.Article.objects.filter(pk=article_id).update(down_num=F('down_num') + 1)
                            models.UpAndDown.objects.create(user=request.user,article=article_obj,is_up=is_up)
                            
                            
                            back_dic['code'] = 2000
                            back_dic['msg'] = '点赞成功' if is_up else '点踩成功'           # 三元表达式 应用
                        else:
                            back_dic['code'] = 2001
                            back_dic['msg']  = '你已经点过了'
                    else:
                        back_dic['code'] = 2002
                        back_dic['msg']  = '你个臭不要脸 不能给自己点'
                else:
                    back_dic['code'] = 2003
                    back_dic['msg'] = '未知错误'
            else:
                back_dic['code'] = 2004
                back_dic['msg'] = mark_safe('请先<a href="/login/">登陆</a>')
            return JsonResponse(back_dic)
  • 相关阅读:
    【CSS】盒子模型的计算
    【CSS】定义元素的位置
    【Jenkins】安装插件
    安装【Jenkins】
    Python【unittest】模块
    Python【pyyaml】模块
    CentOS下安装gcc和gdb
    汇编学习笔记(15)综合研究
    汇编学习笔记(14)BIOS对键盘输入的处理
    汇编学习笔记(13)直接定址表
  • 原文地址:https://www.cnblogs.com/klw1/p/11256137.html
Copyright © 2011-2022 走看看