私は現在、ユーザーが自己評価を実行できるようにするプロジェクトに取り組んでいます。現在、評価の基準を MySQL テーブルに保存し、そのテーブルを反復処理して FORM オブジェクトを作成し、各行にドロップダウン リストを追加します。これで簡単にフォームを作成できますが、挿入コマンドをフォーム受け入れ条件ブロック内に配置すると、アンダースコアを使用する最初のフィールド割り当てで構文エラーが発生します。テーブルのコードは次のとおりです。
db.define_table('Evaluation', Field('EvaluationId', 'integer', 'id'),
Field('PersonBeingEvaluated', db.Person, 'integer'),
Field('PersonEvaluating', 'integer'),
Field('EvalDate', 'datetime'),
Field('1_1A', 'integer'), Field('1_1B', 'integer'), Field('1_2', 'integer'),
Field('1_3', 'integer'), Field('1_4', 'integer'), Field('1_5', 'integer'),
Field('1_6', 'integer'), Field('2_1', 'integer'), Field('2_2A', 'integer'),
Field('2_2B', 'integer'), Field('2_3A', 'integer'), Field('2_3B', 'integer'),
Field('2_4', 'integer'), Field('2_5', 'integer'), Field('3_1', 'integer'),
Field('3_2', 'integer'), Field('3_3', 'integer'), Field('3_4', 'integer'),
Field('3_5A', 'integer'), Field('3_5B', 'integer'), Field('3_6', 'integer'),
Field('3_7', 'integer'), Field('3_8', 'integer'), Field('3_9A', 'integer'),
Field('3_9B', 'integer'), Field('3_9C', 'integer'), Field('4_1', 'integer'),
Field('4_2', 'integer'), Field('4_3A', 'integer'), Field('4_3B', 'integer'),
Field('4_4', 'integer'), Field('BeliefsScore', 'integer'),
Field('CharacterScore', 'integer'), primarykey=['EvaluationId'])
そして、私のメソッドのコード:
@auth.requires_login()
def Take_Eval():
user = db(db.Person.auth_userUserId == auth.user.id).select().first().PersonId
table = db(db.PageContent.ContentId > 0).select()
accordion = DIV(_id="accordion")
for row in table:
accordion.append(H2(row['ContentDescription'], _style="padding-left: 10px;"))
accordion.append(DIV(XML(row.ContentHTML), BR(), P(SELECT(OPTGROUP(OPTION('Does not Attempt', _value=0),
OPTION('Developing', _value=1), OPTION('Progressing', _value=2), OPTION('Established', _value=3),
OPTION('Advanced', _value=4), OPTION('Master', _value=5)), _id=row['QuestionNumber']), _style='text-align: center;')))
form = FORM(accordion, BR(), P(INPUT(_type='submit', _value='Submit', _name='btnSubmit'), _style="text-align: center;"))
if form.accepts(request, session):
response.flash = 'Evaluation Saved Successfully on ' + str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
db.Evaluation.insert(PersonBeingEvaluated=user, PersonEvaluating=0, EvalDate=datetime.now(),
1_1A = form.vars.1_1A, 1_1B = form.vars.1_1B, 1_2 = form.vars.1_2, 1_3 = form.vars.1_3,
1_4 = form.vars.1_4, 1_5 = form.vars.1_5, 1_6 = form.vars.1_6, 2_1 = form.vars.2_1,
2_2A = form.vars.2_2A, 2_2B = form.vars.2_2B, 2_3A = form.vars.2_3A, 2_3B = form.vars.2_3B,
2_4 = form.vars.2_4, 2_5 = form.vars.2_5, 3_1 = form.vars.3_1, 3_2 = form.vars.3_2,
3_3 = form.vars.3_3, 3_4 = form.vars.3_4, 3_5A = form.vars.3_5A, 3_5B = form.vars.3_5B,
3_6 = form.vars.3_6, 3_7 = form.vars.3_7, 3_8 = form.vars.3_8, 3_9A = form.vars.3_9A,
3_9B = form.vars.3_9B, 3_9C = form.vars.3_9C, 4_1 = form.vars.4_1, 4_2 = form.vars.4_2,
4_3A = form.vars.4_3A, 4_3B = form.vars.4_3B, 4_4 = form.vars.4_4,
BeliefsScore = form.vars.BeliefsScore, CharacterScore = form.vars.CharacterScore)
redirect(URL('default', 'index'))
elif form.errors:
response.flash = 'Profile could not be submitted. Please try again later. '
return locals()
この問題を解決するために、ドロップダウン リストの命名規則が間違っている可能性があると考えて、フォームをリファクタリングしました。しかし、私はそうではないと思います。私はまた、次の行に沿って何かを使用しようとしました:
1_1A = form.vars.1_1A.value
数値ではなくドロップダウンリストを割り当てていたのではないかと思いましたが、エラーコードも変わりませんでした。この問題の最適な解決策は、コードを正しくコンパイルし、挿入時に各ドロップダウン リストに整数をデータベースに送信させることです。
私の挿入メソッドの構文がエラーになる理由を誰か教えてもらえますか? ありがとう。
編集:
HTMLページは次のとおりです。
{{extend 'layout.html'}}
<script>
$(function() {
$("#accordion").accordion({
header: "h2",
autoHeight: false
});
});
</script>
<h1>Evaluation Info</h1>
<br />
<div id="contentPane">
{{=form}}
</div>
<br />
実際のページ自体は数千行の長さです。ただし、選択タグのマークアップも取得しました。
<p style="text-align: center;"><select id="Q1_1A"><optgroup>
<option value="0">Does not Attempt</option>
<option value="1">Developing</option>
<option value="2">Progressing</option>
<option value="3">Established</option>
<option value="4">Advanced</option>
<option value="5">Master</option>
</optgroup></select></p>
他に何か必要な場合はお知らせください。