Peewee ORMを使用したフラスコアプリケーションに次のモデルがあります。
class Course(db.Model):
name = CharField()
class Activity(db.Model):
course = ForeignKeyField(Course)
name = CharField()
各コースが optgroup であり、各アクティビティが Jinja の opgroup 内のオプションである複数選択フィールドを生成したいと考えています。
次のようなものがあるとします。
- コースⅠ
- 活動Ⅰ
- 活動Ⅱ
- 活動Ⅲ
- コースⅡ
- 活動Ⅳ
- 活動Ⅴ
つまり、アクティビティ I、II、および III の ForeignKeyField はコース I を指し、コース II の ForeignKeyField はアクティビティ IV および V を指します。
Flask アプリケーションに次のビューがあります。
@app.route("/activities")
@login_required
def activities():
activities = Activity.select()
return render_template("activities.html",
activities = activities)
私はこのようなものを取得したい:
<select>
<optgroup label="Course I">
<option>Activity I</option>
<option>Activity II</option>
<option>Activity III</option>
</optgroup>
<optgroup label="Course II">
<option>Activity IV</option>
<option>Activity V</option>
</optgroup>
</select>
これは、Jinja の optgroup 部分なしで簡単に取得できます。
<select>
{% for activity in activities %}
<option value="{{activity.id}}">{{activity.name}}</option>
{% endfor %}
</select>
しかし、optgroup で Course.name フィールドを取得する方法がわかりません。次に、ForeignKeyField を持つアクティビティが、この optgroup 内のオプションでこのコースを指しています。私が思いつく唯一の解決策は、すべてのコースを for ループで実行し、その for ループ内に別の for ループを作成して、すべてのアクティビティを実行し、 activity.Course.name フィールドが course.name と一致する場合に新しいオプションを生成することです。 、しかし、各コースのすべてのアクティビティをループする必要があるため、これは非常に非効率的です.
この選択ボックスを生成する簡単で効率的な方法はありますか?