5

SelectFieldWTFormsのメソッドが次の形式のcan引数を取ることを理解しchoicesています...

choices=[("value1", "display of value 1"), ("value2", "display of value 2")]

データベースへの呼び出しに基づいて選択肢を入力する必要があります。バックエンドとしてneo4jを使用しているため、モデルフォームやその他の組み込みソリューションを使用してデータをフォームに入力することはできません。

def get_list_of_things():
    query = 'start n = node:things("*:*") return ID(n), n.display_name;'
    t = cypher.execute(cdb, query)[0]
    for x in t:
        x[0] = str(x[0])
        x[1] = str(x[1])
    things = list(tuple(x) for x in t)
    return things

class SelectAThing(Form):
    thingID = SelectField('Thing name', choices=get_list_of_things())

choices = get_list_of_things()を実行すると、有効な選択肢のリストが生成されます。これは基本的に機能します。

ただし、データベースが更新してもリストが更新されていないようで、後でそのフォームに戻ります。dbに追加して戻ると、最初のリストが表示されます。

4

3 に答える 3

7

うん-あなたはそれを手に入れました。WTFormsは、そのように少し直感的ではありません。

ちなみに、SQLAlchemyデータベースから選択肢を引き出す場合(そしてFlaskを使用している場合)は、QuerySelectFieldアドオンを確認してください。

http://wtforms.simplecodes.com/docs/0.6.1/ext.html#module-wtforms.ext.sqlalchemy

from wtforms.ext.sqlalchemy.fields import QuerySelectField

def all_employees():
  return Employee.query

class BugReportForm(Form):
  description = TextField(u"Notes")
  # The get_label will show the "name" attribute of the Employee model
  assign_to = QuerySelectField(u'Assign to',
                           get_label=u"name",
                           query_factory=all_employees)

これにより、全員の名前が表示された[選択]フィールドが表示されます。

ボーナス:ビューコードでBugReportForm.assign_to.dataにアクセスすると、(IDではなく)Employeeオブジェクトが返されます。便利です。

于 2012-12-09T01:28:02.970 に答える
6

ダミーはありません。クラスに入れないでください。ビューコードに入れてください。

@app.route('/route')
def routename()
    form = SelectAThing()
    form.orgid.choices=get_joinable_orgs()

ビューで初期化した後、通常のPythonオブジェクトのようにフォームに割り当てることができることに気づかなかったため、これは注意が必要です。

于 2012-12-08T21:14:24.657 に答える
0

同じ問題が発生しました。QuerySelectFieldを試しましたが、これは「select input」ではなく、ul要素であるため、onchangeなどのイベントを受け入れることができず、JavaScriptで値を取得するのが難しいため、selectFieldフィールドを保持する必要があります。 、これはカスタムパスではなく、これはモーダルビューであるため、render関数内のkawargs ['form']。column.choicesを更新し、selectFieldの検証をオンにして、アプリケーションをリロードせずに更新されたストリートを受け入れます。

form_extra_fields = {
    'streetname': SelectField(
        'streetname',
        coerce=str,
        choices=([street.streetname for street in db.session.query(StreetsMetadata).all()]),
        render_kw={'onchange': "myFunction()"},
        validate_choice=False
        ),
    }

def render(self, template, **kwargs):
    """
    using extra js in render method allow use
    url_for that itself requires an app context
    """
    # solved By Python King
    if 'form' in kwargs and 'streetname' in kwargs['form'] and 'choices' in vars(kwargs['form'].streetname):
        kwargs['form'].streetname.choices = [street.streetname for street in db.session.query(StreetsMetadata).all()]
    self.extra_js = [url_for("static", filename="admin/js/users.js")]
    response = render_miror(self, template, **kwargs)
    return response
于 2021-12-15T06:54:58.653 に答える