zoukankan      html  css  js  c++  java
  • BBS项目之后台管理

    一:后台管理,添加文章样式编写

    创建 一个后台管理模板前段页面

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css">
        <script src="/static/jquery-3.3.1.js"></script>
    
        <script src="/static/bootstrap-3.3.7-dist/js/bootstrap.js"></script>
        <title>后台管理</title>
        <style>
            .head {
                background: yellowgreen;
                height: 60px;
                margin-bottom: 30px;
            }
        </style>
    </head>
    <body>
    <div class="head">
        <p>后台管理</p>
    </div>
    <div class="container-fluid">
        <div class="row ">
            <div class="col-md-3">
                <div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true">
                    <div class="panel panel-default">
                        <div class="panel-heading" role="tab" id="headingOne">
                            <h4 class="panel-title">
                                <a role="button" data-toggle="collapse" data-parent="#accordion" href="#collapseOne"
                                   aria-expanded="true" aria-controls="collapseOne">
                                    博客相关操作
                                </a>
                            </h4>
                        </div>
                        <div id="collapseOne" class="panel-collapse collapse in" role="tabpanel"
                             aria-labelledby="headingOne">
                            <div class="panel-body">
                                <a href="/add_article/">添加文章</a>
                            </div>
                        </div>
                        <div id="collapseOne" class="panel-collapse collapse in" role="tabpanel"
                             aria-labelledby="headingOne">
                            <div class="panel-body">
                                <a href="">添加随笔</a>
                            </div>
                        </div>
                        <div id="collapseOne" class="panel-collapse collapse in" role="tabpanel"
                             aria-labelledby="headingOne">
                            <div class="panel-body">
                                <a href="https://www.cnblogs.com/ouyang99-">返回欧阳的博客园</a>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
            <div class="col-md-9">
    
                <div>
    
                    <!-- Nav tabs -->
                    <ul class="nav nav-tabs" role="tablist">
                        <li role="presentation" class="active"><a href="#home" aria-controls="home" role="tab"
                                                                  data-toggle="tab">文章</a></li>
                        <li role="presentation"><a href="#profile" aria-controls="profile" role="tab" data-toggle="tab">随笔</a>
                        </li>
                        <li role="presentation"><a href="#messages" aria-controls="messages" role="tab" data-toggle="tab">日记</a>
                        </li>
                        <li role="presentation"><a href="#settings" aria-controls="settings" role="tab" data-toggle="tab">评论</a>
                        </li>
                    </ul>
    
                    <!-- Tab panes -->
                    <div class="tab-content">
                        <div role="tabpanel" class="tab-pane active" id="home">
                            {% block article %}
                            {% endblock %}
    
                        </div>
                        <div role="tabpanel" class="tab-pane" id="profile">随笔</div>
                        <div role="tabpanel" class="tab-pane" id="messages">日记</div>
                        <div role="tabpanel" class="tab-pane" id="settings">评论</div>
                    </div>
    
                </div>
    
    
    
            </div>
    
    
        </div>
    
    </div>
    
    </div>
    
    </body>
    </html>
    back_base.html

     二: 后台开始前段页面

    {% extends 'back/back_base.html' %}
    {% block article %}
    <table class="table table-striped table-hover">
                    <thead>
                    <tr>
                        <th>文章标题</th>
                        <th>发布时间</th>
                        <th>评论数</th>
                        <th>点赞数</th>
                        <th>修改</th>
                        <th>删除</th>
                    </tr>
                    </thead>
                    <tbody>
                    {% for article in article_list %}
                        <tr>
                            <td><a href="{{ article.blog.userinfo }}/article/{{ article.pk }}">{{ article.title }}</a></td>
                            {#                        # 创建发布时间#}
                            <td>{{ article.create_time|date:'Y-m-d H:i:s' }}</td>
                            <td>{{ article.commit_num }}</td>
                            <td>{{ article.up_num }}</td>
                            <td><a href="">修改</a></td>
                            <td><a href="">删除</a></td>
                        </tr>
                    {% endfor %}
    
                    </tbody>
                </table>
    {% endblock %}
    View Code

    其中的

    <td><a href="{{ article.blog.userinfo }}/article/{{ article.pk }}">{{ article.title }}</a></td>
    
    //其中的{{ article.blog.userinfo }}/article/{{ article.pk }}">{{ article.title }} 代表进入当前文章

    后台逻辑

    # 后台管理函数
    @login_required(login_url='/login/')
    def backend(request):
        if request.method == 'GET':
            # 查询出当前登录用户的所有文章
            blog = request.user.blog
            # 拿到一个queryset对象
            article_list = models.Article.objects.filter(blog=blog)
            return render(request, 'back/backend.html', {'article_list': article_list})
    View Code

    三:添加文章:

    添加文章后台逻辑

    #添加文章
    @login_required()
    def add_article(request):
        if request.method=='GET':
            return render(request,'back/add_article.html')
    
        elif request.method=='POST':
            title=request.POST.get('title')
            content=request.POST.get('content')
            soup = BeautifulSoup(content, 'html.parser')
    
            desc=content[0:150]
    
            blog=request.user.blog
            ret=models.Article.objects.create(title=title,desc=desc,content=content,blog=blog,)
            return redirect('/backend/')
    
    
    #可以局部禁用csrf
    def upload_img(request):# 富文本编辑器上传图片
        print(request.FILES)
        #获取前端的文件
        myfile=request.FILES.get('myfile')
        # 拼接文件夹,目的是将前段传过来的文件存起来
        path= os.path.join(settings.BASE_DIR,'media','img')
        # 要是这个文件夹不存在,就创建爱你一个文件夹
        if not os.path.isdir(path):
            os.mkdir(path)
    
        file_path=os.path.join(path,myfile.name)
        with open(file_path,'wb') as f:
    
            for line in myfile:
                f.write(line)
    
        dic={'error':0,'url':'/media/img/%s'%myfile.name}
    
        return JsonResponse(dic)
    View Code

    添加文章前台代码

    {% extends 'back/back_base.html' %}
    
    {% block home %}
    
    
        <div>
            <p>添加文章</p>
            <form action="/add_article/" method="post">
                {% csrf_token %}
    
                <p>标题</p>
                <p><input type="text" name="title" class="form-control"></p>
                <p>内容(KindEdit编辑器,不支持拖放/粘贴上传图片)</p>
                <p>
                 <textarea name="content" id="editor_id" cols="30" rows="10">
    
    
                    </textarea>
    
                </p>
                <input type="submit" class="btn btn-danger" value="提交">
    
    
            </form>
        </div>
    
    
    
        <script charset="utf-8" src="/static/kindeditor/kindeditor-all.js"></script>
        <script>
            KindEditor.ready(function (K) {
                window.editor = K.create('#editor_id', {
                     '100%',
                    height: '500px',
                    //item 控制要显示的控件
                    resizeType: 0,
                    //上传图片,uploadJson 指的是上传的路径,也就是咱们的路由
                    uploadJson:'/upload_img/',
                    //添加一些额外的参数
                    extraFileUploadParams:{
                        'csrfmiddlewaretoken':'{{ csrf_token }}'
                    },
                    //修改默认上传文件的名字
                    filePostName:'myfile'
    
                })
    
            });
        </script>
    {% endblock %}
    add_artile.html

    四:上传图片

    # 可以局部禁用csrf
    def upload_img(request):
        # 传上来的图片,是文件
        # 是文件,从哪取?
        print(request.FILES)
        myfile = request.FILES.get('myfile')
    
        path = os.path.join(settings.BASE_DIR, 'media', 'img')
        # 不存在这个文件夹
        if not os.path.isdir(path):
            os.mkdir(path)
        file_path = os.path.join(path, myfile.name)
        with open(file_path, 'wb') as f:
            for line in myfile:
                f.write(line)
        dic = {'error': 0, 'url': '/media/img/%s' % myfile.name}
        return JsonResponse(dic)
    def upload_img
     
  • 相关阅读:
    git使用小结
    关于vtordisp知多少?
    虚函数与虚继承寻踪
    最简git Server配置
    StarUML序
    CacheHelper对缓存的控制
    Web Service的一些经验和技巧总结
    月份信息二维坐标图绘制(绘制箭头算法)续
    dynamic与xml的相互转换
    如何将XML与OBJECT进行相互转换(泛型以及通用方法)
  • 原文地址:https://www.cnblogs.com/ouyang99-/p/10073776.html
Copyright © 2011-2022 走看看