You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask表单提交后CSS列表样式异常及空白项目符号问题求助

Flask题目提交表单问题修正方案

核心问题分析

  • 主观题提交后,空白选项会显示无序列表的空白项目符号
  • 用表单复选框控制样式时,会修改所有已存在题目的样式,无法单独标记新增主观题

解决方案步骤

1. 后端:给题目模型增加类型标记

在questions模型中添加q_type字段,区分选择题(mcq)和主观题(desc):

class questions(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    question = db.Column(db.String(500), nullable=False)
    option1 = db.Column(db.String(200))
    option2 = db.Column(db.String(200))
    option3 = db.Column(db.String(200))
    option4 = db.Column(db.String(200))
    marks = db.Column(db.Integer, nullable=False)
    chapter = db.Column(db.String(100), nullable=False)
    # 添加类型字段,默认值为选择题
    q_type = db.Column(db.String(20), default='mcq')

2. 后端:修改提交逻辑,保存题目类型

更新home路由,根据复选框值设置题目类型,主观题可清空选项字段:

@app.route('/home', methods=['GET', 'POST'])
@login_required
def home():    
    form = QuestionForm()
    if form.validate_on_submit():
        # 判断题目类型
        q_type = 'desc' if request.form.get('typesel') == 'desc' else 'mcq'
        # 主观题选项设为空,选择题保留输入值
        new_question = questions(
            question=form.question.data.strip(),
            option1=form.option1.data.strip() if q_type == 'mcq' else '',
            option2=form.option2.data.strip() if q_type == 'mcq' else '',
            option3=form.option3.data.strip() if q_type == 'mcq' else '',
            option4=form.option4.data.strip() if q_type == 'mcq' else '',
            marks=int(form.marks.data),
            chapter=form.chapter.data.strip(),
            q_type=q_type
        )
        db.session.add(new_question)
        db.session.commit()
        return redirect(url_for('home'))     

    que = questions.query.order_by(questions.chapter).all()
    return render_template('home.html', que=que, form=form)

3. 前端:修复空白项目符号问题

在Jinja模板中,仅渲染非空选项,或主观题直接隐藏选项列表:

{% for q in que %}
<div class="des1">
    <input class="m-2 p-2" type="checkbox" name="fq" value="{{ q.id }}" id="selq{{ q.id }}">
    <label class="form-check-label" for="selq{{ q.id }}">          
        <a class="btn btn-sm-light" href="/remove/{{q.id}}" role="button"><i class="bi bi-trash"></i></a> 
        <a class="btn btn-sm-light" href="/edit/{{q.id}}" data-toggle="modal" data-target="#editquesmodal{{q.id}}" role="button"><i class="bi bi-pencil-square"></i></a>   
        Chapter: {{q.chapter}}, Marks: {{ q.marks }}
    </label>
    <div class="des2">
        <h6 class="mt-2"> {{ q.question }} </h6>
        <!-- 仅选择题显示选项列表,且只渲染非空选项 -->
        {% if q.q_type == 'mcq' %}
            <ul>
                {% if q.option1 %}<li class="mainqblock">{{ q.option1 }}</li>{% endif %}
                {% if q.option2 %}<li class="mainqblock">{{ q.option2 }}</li>{% endif %}
                {% if q.option3 %}<li class="mainqblock">{{ q.option3 }}</li>{% endif %}
                {% if q.option4 %}<li class="mainqblock">{{ q.option4 }}</li>{% endif %}
            </ul>
        {% endif %}
    </div>
</div>   
{% endfor %}

4. 前端:修复样式全局修改问题

每个题目通过自身的q_type字段判断样式,不再依赖全局变量:

<!-- 替换原有选项列表逻辑 -->
{% if q.q_type == 'mcq' %}
    <ul>
        {% if q.option1 %}<li class="mainqblock">{{ q.option1 }}</li>{% endif %}
        {% if q.option2 %}<li class="mainqblock">{{ q.option2 }}</li>{% endif %}
        {% if q.option3 %}<li class="mainqblock">{{ q.option3 }}</li>{% endif %}
        {% if q.option4 %}<li class="mainqblock">{{ q.option4 }}</li>{% endif %}
    </ul>
{% else %}
    <!-- 主观题添加自定义提示 -->
    <p><em>主观题:请直接作答</em></p>
{% endif %}

可选优化:表单动态隐藏选项字段

用JavaScript实现勾选主观题时隐藏选项输入框,提升体验:

<script>
document.getElementById('typesel').addEventListener('change', function() {
    const optionGroups = document.querySelectorAll('.form-group.row:has([name^="option"])');
    optionGroups.forEach(group => {
        group.style.display = this.checked ? 'none' : 'flex';
    });
});
</script>

将脚本放在模板{% endblock %}标签之前即可。


内容的提问来源于stack exchange,提问作者DBV

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 16:05:56