设为首页 收藏本站
查看: 566|回复: 1

BBS个人网点搭建、文章展示、侧边栏展示筛选

[复制链接]
累计签到:528 天
连续签到:1 天
发表于 2022-11-10 00:23:38 | 显示全部楼层 |阅读模式
后端代码:def site(request,username,**kwargs):# **kwargs因为前端的路由匹配是关键字传参,所以用这个更合适一点
    # 先校验当前用户名对应的站点是否存在
    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)
    # 1、查看当前用户下的所有分类及分类下的所有文章
    # article_list = models.Category.objects.filter(blog=blog).annotate(count_num=Count('article')).value('name','count_num')
    # select name,count(blog) from category  where blog=blog group by name
    # 2、按照年月统计所有的文章数
    # date_list = models.Article.objects.filter(blog=blog).annotate(month=TruncMonth('create_time')).values('month').annotate(count_num=Count('pk')).values_list('comment_num','month')
    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)
    return render(request,'site.html',locals())

前端代码①errors.html直接拷贝博客园报错页面,记住css的样式也要一起拷贝<html>
<head>
    <meta charset='utf-8'>
    <link rel="icon" href="//common.cnblogs.com/favicon.ico" type="image/x-icon" />
    <title>404 页面不存在 - 博客园</title>
    <style type='text/css'>
        body {
            margin: 8% auto 0;
            max-width: 400px;
            min-height: 200px;
            padding: 10px;
            font-family: 'PingFang SC', 'Microsoft YaHei', 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif;
            font-size: 14px;
            padding-right: 200px;
            position: relative;
        }
        p { color: #555;margin: 15px 0px; }
        img { border: 0px; }
        .d { color: #404040; }
        .robot img { max-width: 192px; }
        .robot { position: absolute; top: 0; right: 0; }
    </style>
</head>
<body>
    <p style="margin-left: 5px;"><a href="/home/"><img src="//common.cnblogs.com/logo.svg" style="height:45px" alt="cnblogs"></a></p>
    <div style="margin-top:20px">
        <p style=""><b style="">404.</b> 抱歉,您访问的资源不存在。</p>
        <p class="d">可能是网址有误,或者对应的内容被删除,或者处于私有状态。</p>
        <p style="color:#777;">代码改变世界,联系邮箱 contact@python666.com</p>
    </div>
    <p><a href="/home/">返回网站首页</a></p>
</body>
</html>
②site.html之文章展示{% block content %}
    <ul class="media-list">
          {% for article_obj in article_list %}
                <li class="media">
                <h4 class="media-heading"><a href="/{{ username }}/article/{{ article_obj.pk }}/">{{ article_obj.title }}</a></h4>
                <div class="media-left">
                      <a href="#">
                        <img class="media-object" src="/media/{{ article_obj.blog.userinfo.avatar }}" width="80px" alt="...">
                      </a>
                </div>

                <div class="media-body">
                            {{ article_obj.desc }}
                </div>
{#                    Newbe36523 发布于 2020-06-11 09:04 评论(0)阅读(23)#}
                <div class="pull-right">
                    <span>posted&nbsp;&nbsp;</span>
                    <span>@&nbsp;&nbsp;</span>
                    <span>{{ article_obj.create_time|date:'Y-m-d' }}&nbsp;&nbsp;</span>
                    <span>{{ article_obj.blog.userinfo.username }}&nbsp;&nbsp;</span>
                    <span><span class="glyphicon glyphicon-comment"></span>评论({{ article_obj.comment_num }})&nbsp;&nbsp;</span>
                    <span><span class="glyphicon glyphicon-thumbs-up"></span>点赞({{ article_obj.up_num }})&nbsp;&nbsp;</span>
                    <span><a href="#">编辑</a></span>
                </div>
                </li>
                <hr>
          {% endfor %}
    </ul>
{% endblock %}
③site.html之侧边栏展示后端代码传来的参数    # 1、查看当前用户下的所有分类及分类下的所有文章/标签一样的写法所以省略
    # article_list = models.Category.objects.filter(blog=blog).annotate(count_num=Count('article')).value('name','count_num')
    # select name,count(blog) from category  where blog=blog group by name
    # 2、按照年月统计所有的文章数
    # date_list = models.Article.objects.filter(blog=blog).annotate(month=TruncMonth('create_time')).values('month').annotate(count_num=Count('pk')).values_list('comment_num','month')<div class="panel panel-primary">
  <div class="panel-heading">
    <h3 class="panel-title">文章分类</h3>
  </div>
  <div class="panel-body">
    {% for category in category_list %}
            <p><a href="/{{ username }}/category/{{ category.2 }}">{{ category.0 }}({{ category.1 }})</a></p>
    {% endfor %}

  </div>
</div>
<div class="panel panel-danger">
  <div class="panel-heading">
    <h3 class="panel-title">文章标签</h3>
  </div>
  <div class="panel-body">
    {% for tag in tag_list %}
        <p><a href="/{{ username }}/tag/{{ tag.2 }}">{{ tag.0 }}({{ tag.1 }})</a></p>
    {% endfor %}

  </div>
</div>
<div class="panel panel-info">
  <div class="panel-heading">
    <h3 class="panel-title">日期归档</h3>
  </div>
  <div class="panel-body">
    {% for date in date_list %}
        <p><a href="/{{ username }}/archive/{{ date.0|date:'Y-m' }}">{{ date.0|date:'Y-m' }}({{ date.1 }})</a></p>
    {% endfor %}

  </div>
</div>
④site.html之不同站点展示不同样式<link rel="stylesheet" href="/media/css/{{ blog.state_theme }}">
⑤site.html之侧边栏筛选功能参考思路:
python
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/ 日期
后端路由和视图函数
路由层
# url(r'^(?P<username>\w+)/category/(\d+)',views.site),  d+后面是数字(1)
# url(r'^(?P<username>\w+)/tag/(\d+)',views.site),
# url(r'^(?P<username>\w+)/archive/(\w+)',views.site), w+后面是数字和符号(日期格式2020/12/13)
# 上面的三条url可以合并成一条
url(r'^(?P<username>\w+)/(?P<condition>category|tag|archive)/(?P<param>.*)/',views.site),
视图层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)前端渲染补全a标签的url既可以<h4 class="media-heading"><a href="/{{ username }}/article/{{ article_obj.pk }}/">{{ article_obj.title }}</a></h4>






运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-1002677-1-1.html 上篇帖子: 求助,帮忙看看,这个子进程怎么不执行 下篇帖子: 五、BBS 文章详情页展示、侧边栏制作成inclusion_tag标签
累计签到:528 天
连续签到:1 天
 楼主| 发表于 2022-11-10 20:40:44 | 显示全部楼层
# 内容回顾
[前后端基于ajax交互的话 那么后端同常会返回字典格式的数据]
登录功能后端实现
    1、验证码判断是否正确
        忽略大小写

# 首页搭建
[django admin后台管理]
    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路由分发的本质:
路由层的返回格式:
url(r'^admin/', admin.site.urls)从点urls的返回结果可以得到返回的是一个()元组

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()
    [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的分类三>
    [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的标签三>
    [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')
    # 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可以合并成一条
    url(r'^(?P<username>\w+)/(?P<condition>category|tag|archive)/(?P<param>.*)/',views.site)
[判断用户到底想按照哪个条件筛选数据]
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)
        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)
5、 手动补全侧边栏url即可

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表