0

これが私のデータベース定義です:

db.define_table('emsAlertTokens',

Field('emsrelease','string',default=session.releasefield,writable=False,label=T('Release')),
            Field('emsmachine','string',default=session.machinefield,writable=False,label=T('Machine')),
            Field('emsstartdate','datetime',default=request.now,label=T('Start Date')),
            Field('emsenddate','datetime',IS_NOT_EMPTY(error_message='Please specify the End Date.'), label=T('End Date')),
            Field('errorgrepfile','upload',requires=IS_NOT_EMPTY(error_message='Please upload a valid error tokens file'),custom_store=ems_file, custom_retrieve=ems_retrieve, autodelete=True, uploadfield=True, uploadfs=None, label=T('Error Tokens')),
            Field('tokenname','string',requires=IS_NOT_EMPTY('What would you call your token file?'),label=T('Token File Name')))

お気づきのとおり、emsmachine フィールドと emsrelease フィールドはセッションからのものです。私の要件は、この 2 つの値の組み合わせを一意にすることです。

以下のバリデーターで試しましたが、うまくいきません。

db.emsAlertTokens.emsrelease.requires = IS_NOT_IN_DB(db(db.emsAlertTokens.emsmachine == session.machinefield), 'emsAlertTokens.emsrelease', error_message='EMS token file already exist for this release.')

これでもうまくいきません:

db.emsAlertTokens.emsrelease.requires = IS_NOT_IN_DB(db(db.emsAlertTokens.emsmachine == request.vars.emsmachine), 'emsAlertTokens.emsrelease', error_message='EMS token file already exist for this release.')

これについて私を助けてください。

4

1 に答える 1

1

バリデーターはフォーム入力用であり、これら 2 つのフィールドは書き込み可能ではない (したがってフォームの一部ではない) ため、バリデーターは適用されません (書き込み不可フィールドに設定されたデフォルト値は検証されません)。

これらのフィールドのデフォルト値が以前の時点でセッションに追加されていることを考えると、その時点でそれらの結合の一意性を検証する必要があります。

別のオプションは、値が事前に入力されたフォームにフィールドを含めることですが、HTML の「読み取り専用」属性を含めて、ユーザーがそれを変更できないようにすることです。

Field('emsrelease', 'string', label=T('Release'),
      widget=lambda f, v: SQLFORM.widgets.string.widget(f, session.releasefield,
                                                        _readonly=True),
      requires=IS_NOT_IN_DB(db(db.emsAlertTokens.emsmachine == session.machinefield),
                            'emsAlertTokens.emsrelease',
                            error_message='EMS token file already exist for this release.')),
Field('emsmachine', 'string', label=T('Release'),
      widget=lambda f, v: SQLFORM.widgets.string.widget(f, session.machinefield,
                                                        _readonly=True))

そのため、フィールドを書き込み不可 (したがってフォームから除外する) にしてデフォルト値を設定する代わりに、上記はウィジェットに値を事前に入力し、ウィジェットを「読み取り専用」に設定します (このメソッドでは、敵対者はフォームで送信された値を操作する可能性があるため、その可能性が心配な場合は、追加のバリデーターを追加して、送信された値がセッションの値と一致することを確認できます)。

于 2015-03-30T15:38:49.933 に答える