9

フラスコ、wtforms、および Flask-WTForms の最新バージョンを使用しています。

フォームを表示するページがあり、1 つは「A」というオプション オプションを含む選択ボックスです。

アプリが起動すると、すべてがうまくいきます。別のフォームで、「B」というレコードを追加します。

ここで、必要なフォームには、オプション A と B ボットを含む選択ボックスが必要です。オプション A のみが使用可能です。wtforms でデータを更新するには、uWSGI を強制終了して再起動する必要があります。

それで、私は何が欠けていますか?wtforms でデータを更新するにはどうすればよいですか?

getAgencyList が選択ボックスに追加するオプションのリストを返すフォームを作成する方法を次に示します。別のダイアログで代理店を追加すると、アプリを再起動せずに代理店リストが更新されます。

class createUser(Form):
    """
    Users are given a default password
    """
    first_name   = TextField()
    last_name    = TextField()
    email = TextField('Email', [validators.Length(min=6, max=120), validators.Email()])
    user_role = SelectField(u'User Role', choices=[('1', 'User'), ('2', 'Admin')])
    org_role = SelectField(u'User Role', choices=[('1', 'Agency'), ('2', 'Advertiser'),('3', 'Admin')])
    agency = SelectField(u'Agency', choices=getAgencyList())
4

2 に答える 2

11

問題はgetAgencyList()、クラスの定義時に呼び出されることです。したがって、その関数がその時点で返すものはすべて、データになります。getAgencyListリスト情報を更新するには、インスタンス化中に何らかの方法で実行する必要があります。これを行うために、特定のフィールドに選択肢を追加できるwtformsに関するあまり明白ではない事実を使用できます。ドキュメントはここにあり、「動的選択値を持つフィールドの選択」というタイトルのサブセクションを探してください。動作するはずのコードのサンプルを次に示します。

class CreateUserForm(Form):
    first_name = TextField()
    last_name = TextField()
    email = TextField('Email', 
            [validators.Length(min=6, max=120), validators.Email()])
    user_role = SelectField(u'User Role', 
            choices=[('1', 'User'), ('2', 'Admin')])
    org_role = SelectField(u'User Role', 
            choices=[('1', 'Agency'), ('2', 'Advertiser'),('3', 'Admin')])
    agency = SelectField(u'Agency')

    @classmethod
    def new(cls):
        # Instantiate the form
        form = cls()

        # Update the choices for the agency field
        form.agency.choices = getAgencyList()
        return form

# So in order to use you do this ...
@app.route('/someendpoint')
def some_flask_endpoint():
    # ... some code ...
    form = CreateUserForm.new()
    # That should give you a working CreateUserForm with updated values.
    # ... some more code to validate form probably...
于 2012-08-29T08:07:44.627 に答える
1

簡単な解決策は、表示するオプションをデータベースから取得し、フォーム クラスをそれらで上書きすることです。

例えば:

def get_agencies():
    agency_list = []
    # get the Agencies from the database - syntax here would be SQLAlchemy
    agencies = Agency.query.all()
    for a in agencies:
        # generate a new list of tuples
        agency_list.append((a.id,a.name))
    return agency_list

@app.route('/somewhere',methods=['POST'])
def somewhere():
    form = createUser()
    # overwrite the choices of the Form Class
    form.agency.choices = get_agencies()
    # here goes the rest of code - like form.validate_on_submit()
    ...
    return render_template('create_user.html', form=form)
于 2016-01-26T00:04:38.763 に答える