• bbs项目二


    今日内容概要

    • 登陆功能
    • bbs首页搭建
      • 导航条用户功能
    • admin后台管理
    • 首页文章展示
    • 用户头像展示(media配置)
    • 图片防盗链
    • 个人站点页面搭建
    • 侧边栏展示功能
      • 标签
      • 分类
      • 日期
    • 侧边栏筛选功能
    • 将侧边栏制作成inclusion_tag

    登陆功能

    def login(request):
        if request.method == 'POST':
            back_dic = {'code':1000,'msg':''}
            username = request.POST.get('username')
            password = request.POST.get('password')
            code = request.POST.get('code')
            # 1 先校验验证码是否正确      自己决定是否忽略            统一转大写或者小写再比较
            if request.session.get('code').upper() == code.upper():
                # 2 校验用户名和密码是否正确
                user_obj = auth.authenticate(request,username=username,password=password)
                if user_obj:
                    # 保存用户状态
                    auth.login(request,user_obj)
                    back_dic['url'] = '/home/'
                else:
                    back_dic['code'] = 2000
                    back_dic['msg'] = '用户名或密码错误'
            else:
                back_dic['code'] = 3000
                back_dic['msg'] = '验证码错误'
            return JsonResponse(back_dic)
        return render(request,'login.html')
    

    首页搭建

    # 1.动态展示用户名称
              {% if request.user.is_authenticated %}
                    <li><a href="#">{{ request.user.username }}</a></li>
                    <li class="dropdown">
              <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">更多操作 <span class="caret"></span></a>
              <ul class="dropdown-menu">
                <li><a href="#">修改密码</a></li>
                <li><a href="#">修改头像</a></li>
                <li><a href="#">后台管理</a></li>
                <li role="separator" class="divider"></li>
                <li><a href="#">退出登陆</a></li>
              </ul>
            </li>
              {% else %}
                    <li><a href="{% url 'reg' %}">注册</a></li>
                    <li><a href="{% url 'login' %}">登陆</a></li>
              {% endif %}
              
    # 更多操作
    
    

    admin后台管理

    """
    django给你提供了一个可视化的界面用来让你方便的对你的模型表
    进行数据的增删改查操作
    
    如果你先想要使用amdin后台管理操作模型表
    你需要先注册你的模型表告诉admin你需要操作哪些表
    
    去你的应用下的admin.py中注册你的模型表
    	from django.contrib import admin
      from app01 import models
      # Register your models here.
    
      admin.site.register(models.UserInfo)
      admin.site.register(models.Blog)
      admin.site.register(models.Category)
      admin.site.register(models.Tag)
      admin.site.register(models.Article)
      admin.site.register(models.Article2Tag)
      admin.site.register(models.UpAndDown)
      admin.site.register(models.Comment)
    """
    # admin会给每一个注册了的模型表自动生成增删改查四条url
    http://127.0.0.1:8000/admin/app01/userinfo/  查
    http://127.0.0.1:8000/admin/app01/userinfo/add/  增
    http://127.0.0.1:8000/admin/app01/userinfo/1/change/  改
    http://127.0.0.1:8000/admin/app01/userinfo/1/delete/  删
        
        
    http://127.0.0.1:8000/admin/app01/blog/  查
    http://127.0.0.1:8000/admin/app01/blog/add/  增
    http://127.0.0.1:8000/admin/app01/blog/1/change/  改
    http://127.0.0.1:8000/admin/app01/blog/1/delete/  删
    """
    关键点就在于urls.py中的第一条自带的url
    
    前期我们需要自己手动苦逼的录入数据,自己克服一下
    """
    
    # 1.数据绑定尤其需要注意的是用户和个人站点不要忘记绑定了
    
    # 2.标签
    
    # 3.标签和文章
    	千万不要把别人的文章绑定标签
    

    用户头像展示

    """
    1 网址所使用的静态文件默认放在static文件夹下
    2 用户上传的静态文件也应该单独放在某个文件夹下
    
    media配置
    	该配置可以让用户上传的所有文件都固定存放在某一个指定的文件夹下
    	# 配置用户上传的文件存储位置
    	MEDIA_ROOT = os.path.join(BASE_DIR,'media')  # 文件名 随你 自己
    	会自动创建多级目录
    	
    如何开设后端指定文件夹资源
    	首先你需要自己去urls.py书写固定的代码
    	from django.views.static import serve
    	from BBS14 import settings
    		
    	# 暴露后端指定文件夹资源
      url(r'^media/(?P<path>.*)',serve,{'document_root':settings.MEDIA_ROOT})
      
    """
    

    图片防盗链

    # 如何避免别的网站直接通过本网站的url访问本网站资源
    
    # 简单的防盗
    	我可以做到请求来的时候先看看当前请求是从哪个网站过来的
      如果是本网站那么正常访问
      如果是其他网站直接拒绝
      	请求头里面有一个专门记录请求来自于哪个网址的参数
        	Referer: http://127.0.0.1:8000/xxx/
    
    # 如何避免
    	1.要么修改请求头referer
      2.直接写爬虫把对方网址的所有资源直接下载到我们自己的服务器上
    

    个人站点

    # 全是每个用户都可以有自己的站点样式
    <link rel="stylesheet" href="/media/css/{{ blog.site_theme }}/">
    
    
    
    id		content 			  create_time					month
    1			111							 2020-11-11					2020-11
    2			222							 2020-11-12					2020-11
    3			333							 2020-11-13					2020-11
    4			444							 2020-11-14					2020-11
    5			555							 2020-11-15					2020-11
    """
    django官网提供的一个orm语法
    	from django.db.models.functions import TruncMonth
    -官方提供
    			from django.db.models.functions import TruncMonth
    			Sales.objects
    			.annotate(month=TruncMonth('timestamp'))  # Truncate to month and add to select list
    			.values('month')  # Group By month
    			.annotate(c=Count('id'))  # Select the count of the grouping
    			.values('month', 'c')  # (might be redundant, haven't tested) select month and count
    			
    			
    时区问题报错
    TIME_ZONE = 'Asia/Shanghai'
    USE_TZ = True
    """
    

    侧边栏筛选功能

    https://www.cnblogs.com/jason/tag/Python/  				 标签
    https://www.cnblogs.com/jason/category/850028.html 分类
    https://www.cnblogs.com/jason/archive/2016/10.html 日期
      
      
    https://www.cnblogs.com/jason/tag/1/  				 标签
    https://www.cnblogs.com/jason/category/1 			 分类
    https://www.cnblogs.com/jason/archive/2020-11/ 日期
      
      
      
    def site(request,username,**kwargs):
        """
        :param request:
        :param username:
        :param kwargs: 如果该参数有值 也就意味着需要对article_list做额外的筛选操作
        :return:
        """
        # 先校验当前用户名对应的个人站点是否存在
        user_obj = models.UserInfo.objects.filter(username=username).first()
        # 用户如果不存在应该返回一个404页面
        if not user_obj:
            return render(request,'errors.html')
        blog = user_obj.blog
        # 查询当前个人站点下的所有的文章
        article_list = models.Article.objects.filter(blog=blog)  # queryset对象 侧边栏的筛选其实就是对article_list再进一步筛选
        if kwargs:
            # print(kwargs)  # {'condition': 'tag', 'param': '1'}
            condition = kwargs.get('condition')
            param = kwargs.get('param')
            # 判断用户到底想按照哪个条件筛选数据
            if condition == 'category':
                article_list = article_list.filter(category_id=param)
            elif condition == 'tag':
                article_list = article_list.filter(tags__id=param)
            else:
                year,month = param.split('-')  # 2020-11  [2020,11]
                article_list = article_list.filter(create_time__year=year,create_time__month=month)
    
    
        # 1 查询当前用户所有的分类及分类下的文章数
        category_list = models.Category.objects.filter(blog=blog).annotate(count_num=Count('article__pk')).values_list('name','count_num','pk')
        # print(category_list)  # <QuerySet [('jason的分类一', 2), ('jason的分类二', 1), ('jason的分类三', 1)]>
    
        # 2 查询当前用户所有的标签及标签下的文章数
        tag_list = models.Tag.objects.filter(blog=blog).annotate(count_num=Count('article__pk')).values_list('name','count_num','pk')
        # print(tag_list)  # <QuerySet [('tank的标签一', 1), ('tank的标签二', 1), ('tank的标签三', 2)]>
    
        # 3 按照年月统计所有的文章
        date_list = models.Article.objects.filter(blog=blog).annotate(month=TruncMonth('create_time')).values('month').annotate(count_num=Count('pk')).values_list('month','count_num')
        # print(date_list)
    
        return render(request,'site.html',locals())
    
  • 相关阅读:
    Windows 程序员必备的知识和工具
    由级别和性格特征将程序员分类 看看你属于哪一种
    调试九法:软硬件错误的排查之道<书评>
    逆向反汇编代码推算C++的局部变量
    逆向分析一个完整的C++程序包含寄存器与参数传递详解
    1607:Unable to install InstallShield Scripting runtime
    Form的构造函数和Load事件的区别?
    "春运男子持刀强行劫走17张卧铺票" ....
    SQL SERVER 2005中的Case When用法
    SBO中各个版本的密码
  • 原文地址:https://www.cnblogs.com/chenyoupan/p/13096644.html
Copyright © 2020-2023  润新知