新闻版式编辑详情

编辑详情界面数据

  • admin/views.py 中添加新闻编辑详情视图函数,接收新闻id为参数
@admin_blu.route('/news_edit_detail')
def news_edit_detail():
    """新闻编辑详情"""

    # 获取参数
    news_id = request.args.get("news_id")

    if not news_id:
        return render_template('admin/news_edit_detail.html', data={"errmsg": "未查询到此新闻"})

    # 查询新闻
    news = None
    try:
        news = News.query.get(news_id)
    except Exception as e:
        current_app.logger.error(e)

    if not news:
        return render_template('admin/news_edit_detail.html', data={"errmsg": "未查询到此新闻"})

    # 查询分类的数据
    categories = Category.query.all()
    categories_li = []
    for category in categories:
        c_dict = category.to_dict()
        c_dict["is_selected"] = False
        if category.id == news.category_id:
            c_dict["is_selected"] = True
        categories_li.append(c_dict)
    # 移除`最新`分类
    categories_li.pop(0)

    data = {"news": news.to_dict(), "categories": categories_li}
    return render_template('admin/news_edit_detail.html', data=data)
  • 修改待审核列表中 news_review.html 审核的链接地址:
<td>
    <a href="{{ url_for('admin.news_edit_detail') }}?news_id={{ news.id }}" class="edit">编辑</a>
</td>
  • news_edit_detail.html 数据渲染
<div class="form_group">
    <label>新闻标题:</label>
    <input name="title" type="text" class="input_txt2" value="{{ data.news.title }}">
</div>
<div class="form_group">
    <label>新闻分类:</label>
    <select class="sel_opt" name="category_id">
        {% for category in data.categories %}
            <option value="{{ category.id }}" {% if category.is_selected %}selected{% endif %}>{{ category.name }}</option>
        {% endfor %}
    </select>
</div>
<div class="form_group">
    <label>新闻摘要:</label>
    <textarea class="input_multxt" name="digest">{{ data.news.digest }}</textarea>
</div>
<div class="form_group">
    <label>索引图片:</label>
    <img src="{{ data.news.index_image_url }}" alt="索引图片" class="index_pic">
</div>
<div class="form_group">
    <label>上传图片:</label>
    <input type="file" name="index_image" class="input_file">
</div>
<div class="form_group">
    <label>新闻内容:</label>
    <div class="rich_wrap fl">
        <input class="input_area" id="rich_content" name="content" value="{{ data.news.content }}"></input>
    </div>
</div>
{# 添加隐藏字段新闻id #}
<input type="hidden" name="news_id" value="{{ data.news.id }}">

新闻编辑提交

  • 修改视图函数,使其能够接受POST请求执行保存编辑操作,并实现其代码
@admin_blu.route('/news_edit_detail', methods=["GET", "POST"])
def news_edit_detail():
    """新闻编辑详情"""
    if request.method == "GET":
        ...
        return render_template('admin/news_edit_detail.html', data=data)

    news_id = request.form.get("news_id")
    title = request.form.get("title")
    digest = request.form.get("digest")
    content = request.form.get("content")
    index_image = request.files.get("index_image")
    category_id = request.form.get("category_id")
    # 1.1 判断数据是否有值
    if not all([title, digest, content, category_id]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数有误")

    news = None
    try:
        news = News.query.get(news_id)
    except Exception as e:
        current_app.logger.error(e)
    if not news:
        return jsonify(errno=RET.NODATA, errmsg="未查询到新闻数据")

    # 1.2 尝试读取图片
    if index_image:
        try:
            index_image = index_image.read()
        except Exception as e:
            current_app.logger.error(e)
            return jsonify(errno=RET.PARAMERR, errmsg="参数有误")

        # 2. 将标题图片上传到七牛
        try:
            key = storage(index_image)
        except Exception as e:
            current_app.logger.error(e)
            return jsonify(errno=RET.THIRDERR, errmsg="上传图片错误")
        news.index_image_url = constants.QINIU_DOMIN_PREFIX + key
    # 3. 设置相关数据
    news.title = title
    news.digest = digest
    news.content = content
    news.category_id = category_id

    # 4. 保存到数据库
    try:
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg="保存数据失败")
    # 5. 返回结果
    return jsonify(errno=RET.OK, errmsg="编辑成功")
  • static/admin/js/news_edit_detail.js 中添加以下代码
$(function(){
    $(".news_edit").submit(function (e) {
        e.preventDefault()

        $(this).ajaxSubmit({
            beforeSubmit: function (request) {
                // 在提交之前,对参数进行处理
                for(var i=0; i<request.length; i++) {
                    var item = request[i]
                    if (item["name"] == "content") {
                        item["value"] = tinyMCE.activeEditor.getContent()
                    }
                }
            },
            url: "/admin/news_edit_detail",
            type: "POST",
            headers: {
                "X-CSRFToken": getCookie('csrf_token')
            },
            success: function (resp) {
                if (resp.errno == "0") {
                    // 返回上一页,刷新数据
                    location.href = document.referrer;
                } else {
                    alert(resp.errmsg);
                }
            }
        })
    })
})

注意:在提交的时候需要对参数进行处理,因为在编辑内容的时候,界面上的 input 标签内部的值是不会发生改变的,tinymce 的内容需要通过其指定方法获取,