郑统京 发表于 2022-11-20 20:30:23

二、BBS总结登录、media配置、个人站点、侧边栏展示、筛选

# 内容回顾
[前后端基于ajax交互的话 那么后端同常会返回字典格式的数据]
登录功能后端实现
    1、验证码判断是否正确
      忽略大小写    2、旧密码是否正确
    3、两次密码是否一致    4、auth模块保存登录状态
# 首页搭建
后台管理]
    url.py自带的url
[特点:]
    能够自动生成注册了的模型表的增删改查四条url及响应的界面
[使用:]
    在对应的应用下的admin.py文件中注册模型表即可
    admin.site.register(models.Userinfo)
修改字段名、表名
class UserInfo:
    ...
    username= models.CharField(verbose_name='字段名')
    class Meta:

      verbose_name_plural='表名'

针对BBS在绑定数据的时候一定要细心
    1、先去文章表里面绑定数据
    2、个人站点
    3、文章分类
    4、用户和个人站点
    5、文章与文章标签

# admin路由分发的本质:
路由层的返回格式:
1、url(r'^admin/', admin.site.urls)从点urls的返回结果可以得到返回的是一个()元组2、还可以是as_view闭包函数变形3、或者是函数地址

url(r'^index',([],None,None)) include 可以无限制嵌套N多层

url(r'^index/',([
                  url(r'^index_1',([],None,None)) 路由后可以是元组
                  url(r'^index_2',view.index)可以是函数内存地址
                  url(r'^index_3',view.类.as_view()], 可以是类.as_view()
            None,None))

# media配置用户上传的文件自动创建media文件夹存储数据
网站所使用的静态资源都是放在static文件夹下的
用户上传的静态文件资源也应该单独找个位置存放

media配置
    setting.py
      MEDIA_ROOT = os.path.join(BASE_DIR,'media')
用户创建文件会自动创建media文件夹然后在文件夹内存储数据

# 如何自定义暴露后端资源
需要自己在url.py中书写代码
from django.views.static import serve
from BBS14 import settings
[固定写法不要自己改动]
url(r'^media/(?P<path>.*)',serve,{'document_root':settings.MEDIA_ROOT}),


# 个人站点
由于url方法第一个参数是正则表达式,所以当路由特别多的时候可能出现被顶底的情况
有两种解决方式
    1、修改正则表达式,或者$符号锁死
    2、调整url方法的位置放到前面

[个人站点样式不同实现方法]
1、页面布局不再是282 编程左右布局
2、个人站点每个人的样式都不一样内部大致如何实现的
    内部给每个人可以自定一css和js的文件接口并且用户自定义之后会将用
    户的文件 保存下来,之后打开会自动加载用户自己写的css和js从而实现每个用户界面不一样的情况
3、侧边栏展示问题[链式操作原理]
    只要你的orm学的没有问题一般下没有难度
    只要式queryset对象就可以无线的点击queryset对象方法
      filter().filter().filter().filter()
    、查询当前的用户所有分类及分类下的文章数]
    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的分类三>
    反向查询表名小写-
    、查询所有用户下的标签空标签下文章数]
    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的标签三>
    、按照年月统计所有时间]
    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','pk')
    # 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)
      1、需要截取日期字段
            参考官网提供的方法
            from django.db.models.functions import TruncMonth
            不单单按照年月问题,还可以按照秒,分钟
      2、如果日期出现错误
            在settings改一下时区
            TIME_ZONE = 'Asia/Shanghai'
            USE_TZ = False
4、侧边栏筛选功能
    1、多个url公用一个视图函数
    2、当多个url公用一个视图函数 你应该思考着多个url能不能优化一下
[优化思想]
    # url(r'^(?P<username>\w+)/category/(\d+)',views.site),
    # url(r'^(?P<username>\w+)/tag/(\d+)',views.site),
    # url(r'^(?P<username>\w+)/archive/(\w+)',views.site),
    # 上面的三条url可以合并成一条
    -

[判断用户到底想按照哪个条件筛选数据]
article_list = models.Article.objects.filter(blog=blog)
    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)在文章表中就是有的直接取id就可以了]
      elif condition == 'tag':
            article_list=article_list.filter(tags__id=param)[标签id在文章表中没有通过正向跨表查询,字段加双下划线tags__id]
      else:
            year,month=param.split('-') # 2020-11
            article_list = article_list.filter(create_time__year=year,create_time__month=month)
5、 手动补全侧边栏url即可












页: [1]
查看完整版本: 二、BBS总结登录、media配置、个人站点、侧边栏展示、筛选