【问题标题】:sqlalchemy How to treat each row in database as a single list and iterate through each list?sqlalchemy 如何将数据库中的每一行视为一个列表并遍历每个列表?
【发布时间】:2020-05-20 09:34:59
【问题描述】:

我是一个初学者,我正在尝试使用 sqlalchemy、flask 和 python3 构建一个简单的多选测验平台。我有一个 index.html 页面,其中一部分看起来像:

{% for q in quiz %}
    <li>{{ q.question }}</li>
    <input type='radio' value='A' name='choice' /> {{q.optionA}}
    <input type='radio' value='B' name='choice' /> {{q.optionB}}
    <input type='radio' value='C' name='choice' /> {{q.optionC}}
    <input type='radio' value='D' name='choice' /> {{q.optionD}}
{% endfor %}

在我的 routes.py 中,我在下面添加了一行,以便我可以以列表的形式遍历我的测验数据库:

 quiz = Quiz.query.all()
 return render_template('index.html', title='Home', posts=posts, quiz=quiz)

在我的数据库中,测验看起来像:

class Quiz(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    question = db.Column(db.String(150))
    optionA = db.Column(db.String(150))
    optionB = db.Column(db.String(150))
    optionC = db.Column(db.String(150))
    optionD = db.Column(db.String(150))
    answer = db.Column(db.String(1))
    quizCode = db.Column(db.String(2))

到目前为止,我的数据库中只有两个问题,它们看起来像:

  • 2+2
    4. 5. 6. 7.
  • 2+3
    2. 3. 4. 5.

然后我有问题,因为每次我运行它,并尝试在 index.html 上选择一个选项,我只能选择一个,当我移动到下一个问题并进行选择时,上面问题中的选项将取消选择本身。我知道这是因为所有选项都在同一个组 name='choice' 中,但是我不知道如何解决这个问题。

我试图将每一行作为一个列表进行迭代,以便我可以将每个问题作为一个单独的组:

o = Quiz.query.filter_by(quizCode="1").first()   #I was trying to test if this works
oneItem = o.query.all()    #I want to treat o as a single list so that I can only iterate through o

但我失败了。那么有什么解决方案吗?

【问题讨论】:

    标签: python-3.x flask sqlalchemy jinja2


    【解决方案1】:

    您确实正确地指出了这个问题,因为组名不是唯一的,所以该值被取消选择。

    解决此问题的一种方法是在复选框名称中使用测验的 ID。

    {% for q in quiz %}
       <li>{{ q.question }}</li>
       <input type='radio' value='A' name='choice_{{ q.id }}' /> {{q.optionA}}
       <input type='radio' value='B' name='choice_{{ q.id }}' /> {{q.optionB}}
       <input type='radio' value='C' name='choice_{{ q.id }}' /> {{q.optionC}}
       <input type='radio' value='D' name='choice_{{ q.id }}' /> {{q.optionD}}
    {% endfor %}
    

    注意复选框名称现在是choice_{{ q.id }},这将确保它在循环中保持唯一。

    虽然上述解决方案应该可以解决您的问题,但我强烈建议您使用 flask-wtf 之类的东西来构建您的表单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-07
      • 2020-09-11
      • 2018-12-17
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      相关资源
      最近更新 更多