郑统京 发表于 2022-10-23 19:30:49

BBS首页导航条、admin后台管理、个人站点、侧边栏展示筛选

def home(request):
    # 查询本网站所有的数据展示到前端页面 这里可以使用分页器做分页
    article_queryset = models.Article.objects.all()
    return render(request,'home.html',locals())

[前端导航条代码]      <ul class="nav navbar-nav navbar-right">
          {% 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="#" data-toggle="modal" data-target=".bs-example-modal-lg">修改密码</a></li>
            <li><a href="#">修改头像</a></li>
            <li><a href="#">后台管理</a></li>
            <li role="separator" class="divider"></li>
            <li><a href="{% url 'logout' %}">退出登录</a></li>
          </ul>
{#             引用模态框修改密码       #}
            <div class="modal fade bs-example-modal-lg" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel">
            <div class="modal-dialog modal-lg" role="document">
                <div class="modal-content">
                  <h1 class="text-center">修改密码</h1>
                  <div class="row">
                      <div class="col-md-8 col-md-offset-2">
                        <div class="form-group">
                              <label for="">用户名</label>
                              <input type="text" disabled value="{{ request.user.username }}" class="form-control">
                        </div>
                        <div class="form-group">
                              <label for="">原密码</label>
                              <input type="password" id="id_old_password" class="form-control">
                        </div>
                        <div class="form-group">
                              <label for="">新密码</label>
                              <input type="password" id="id_new_password" class="form-control">
                        </div>
                        <div class="form-group">
                              <label for="">确认密码</label>
                              <input type="password" id="id_confirm_password" class="form-control">
                        </div>
                        <div class="modal-footer">
                        <button type="button" class="btn btn-default" data-dismiss="modal" style="margin-bottom: 10px">取消</button>
                        <button class="btn btn-primary " style="margin-bottom: 10px" id="id_edit">修改</button>
                              <span style="color: red" id="password_error"></span>
                        </div>
                      </div>
                  </div>
                </div>
            </div>
            </div>

      </li>
          {% else %}
            <li><a href="{% url 'login' %}">登录</a></li>
             <li><a href="{% url 'reg' %}">注册</a></li>
          {% endif %}
      </ul>
    </div><!-- /.navbar-collapse -->
</div><!-- /.container-fluid -->
</nav>
<div class="container-fluid">
    <div class="col-md-2">
      <div class="panel panel-primary">
          <div class="panel-heading">
            <h3 class="panel-title">重金求子</h3>
          </div>
          <div class="panel-body">
            事成之后上海别墅一套,外加现金500万
          </div>
      </div>
      <div class="panel panel-danger">
          <div class="panel-heading">
            <h3 class="panel-title">千万大奖</h3>
          </div>
          <div class="panel-body">
            抓紧联系:18311166466
          </div>
      </div>
      <div class="panel panel-info">
          <div class="panel-heading">
            <h3 class="panel-title">线上赌场</h3>
          </div>
          <div class="panel-body">
            性感荷官在线发牌,你还在等什么
          </div>
      </div>
    </div>

    <div class="col-md-8">
      <ul class="media-list">
          {% for article_obj in article_queryset %}
                <li class="media">
                <h4 class="media-heading"><a href="#">{{ 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)#}
                  <br>
                <div>
                  <span><a href="#">{{ article_obj.blog.userinfo.username }}&nbsp;&nbsp;</a></span>
                  <span>发布于&nbsp;&nbsp;</span>
                  <span>{{ article_obj.create_time|date:'Y-m-d' }}&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>
                </div>
                </li>
                <hr>
          {% endfor %}

      </ul>
    </div>

    <div class="col-md-2">
      <div class="panel panel-primary">
          <div class="panel-heading">
            <h3 class="panel-title">重金求子</h3>
          </div>
          <div class="panel-body">
            事成之后上海别墅一套,外加现金500万
          </div>
      </div>
      <div class="panel panel-danger">
          <div class="panel-heading">
            <h3 class="panel-title">千万大奖</h3>
          </div>
          <div class="panel-body">
            抓紧联系:18311166466
          </div>
      </div>
      <div class="panel panel-info">
          <div class="panel-heading">
            <h3 class="panel-title">线上赌场</h3>
          </div>
          <div class="panel-body">
            性感荷官在线发牌,你还在等什么
          </div>
      </div>
    </div>

</div>



[后端修改密码from django.contrib.auth.decorators import login_required@login_required
def set_password(request):
    if request.is_ajax():
      back_dic = {'code':1000,'msg':''}
      if request.method == 'POST':
            old_password = request.POST.get('old_password')
            new_password = request.POST.get('new_password')
            confirm_password = request.POST.get('confirm_password')
            is_right = request.user.check_password(old_password)
            if is_right:
                if new_password == confirm_password:
                  request.user.set_password(new_password)
                  request.user.save()
                  back_dic['msg']='修改成功'
                else:
                  back_dic['code']=1001
                  back_dic['msg']='两次密码不一致'
            else:
                back_dic['code']=1002
                back_dic['msg']='原密码错误'
      return JsonResponse(back_dic)
[前端修改密码<script>
    $('#id_edit').click(function (){
      $.ajax({
            url:'/set_password/',
            type:'post',
            data:{
                'old_password':$('#id_old_password').val(),
                'new_password':$('#id_new_password').val(),
                'confirm_password':$('#id_confirm_password').val(),
                'csrfmiddlewaretoken':'{{ csrf_token }}'
            },
            success:function (args){
                if(args.code=1000){
                  window.location.href='/login/'
                }else{
                  $('#password_error').text(args.msg)
                }
            }
      })
    })
</script>
[后端退出登录@login_required
def logout(request):
    auth.logout(request)
    return redirect('/login/')

[后端个人站点文章、侧边栏展示、侧边栏筛选def site(request,username,**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)
    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
            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')
    # 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())
[前端个人站点代码<link rel="stylesheet" href="/media/css/{{ blog.state_theme }}"><div class="container-fluid">
    <div class="row">
      <div class="col-md-3">
            <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>
      </div>
      <div class="col-md-9">
            <ul class="media-list">
          {% for article_obj in article_list %}
                <li class="media">
                <h4 class="media-heading"><a href="#">{{ 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>

      </div>
    </div>
</div>
==========================================================================[内容
[前后端基于ajax交互的话 那么后端同常会返回字典格式的数据]
登录功能后端实现
    1、验证码判断是否正确
      忽略大小写

# 首页搭建
后台管理]
    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'^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配置
网站所使用的静态资源都是放在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')
    # 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
            article_list = article_list.filter(create_time__year=year,create_time__month=month)
5、 手动补全侧边栏url即可
页: [1]
查看完整版本: BBS首页导航条、admin后台管理、个人站点、侧边栏展示筛选