63

WTForms で SelectField のデフォルト値を設定しようとすると、そのように「デフォルト」パラメーターに値を渡します。

class TestForm(Form):
  test_field = SelectField("Test: ", choices=[(1, "Abc"), (2, "Def")], default=2)

私も次のことを試しました。

class TestForm(Form):
  test_field = SelectField("Test: ", choices=[(1, "Abc"), (2, "Def")], default=(2, "Def"))

デフォルトで選択されたフィールドを「Def」に設定しないでください。これは、TextField などの他の種類のフィールドで機能します。SelectField のデフォルト値をどのように設定しますか?'

4

8 に答える 8

46

この問題は、Fielddata属性defaultが、WTForms が理解できないもの (たとえば、DB モデル オブジェクト - を予期するint) でオーバーライドすることによって引き起こされると思います。これは、次のようにコンストラクターでフォームに入力した場合に発生します。

form = PostForm(obj=post)

data解決策は、フォームにデータが入力された後に属性を手動で設定することです。

form = PostForm(obj=post)
form.category.data = (post.category.id
                      if page.category
                      else 0) # I make 0 my default
于 2013-06-10T08:32:40.540 に答える
39

あなたが投稿した最初の方法は正しいです、そしてそれは私のために働きます。それが機能しないことの唯一の説明は、あなたが古いバージョンのWTFormsを実行しているということである可能性があります、それは1.0.1で私のために機能しました

于 2012-08-23T21:25:59.297 に答える
20

これを行うにはいくつかの方法があります。最初のコード スニペットは確かに正しいです。

ただし、ビューでこれを動的に実行したい場合は、次のこともできます。

form = TestForm()
form.test_field.default = some_default_id
form.process()
于 2015-02-24T00:52:52.650 に答える
10

これはを使用する場合のchoices設定で、次のように機能します。SelectFieldint

test_select = SelectField("Test", coerce=int, choices=[(0, "test0"), (1, "test1")], default=1)

また:

class TestForm(Form):
    test_select = SelectField("Test", coerce=int)

@app.route("/test")
def view_function():
    form = TestForm()
    form.test_select.choices = [(0, "test0"), (1, "test1")]
    form.test_select.default = 1
    form.process()
于 2016-09-08T03:30:18.470 に答える
0

役立つと思われる動的設定のデフォルト選択フィールドに問題があります。モデルは次のようになりました。

class State(db.Model):
    __tablename__ = 'states'
    id = db.Column(db.Integer, primary_key=True)   
    name = db.Column(db.String(128), nullable=False)


class City(db.Model):
    __tablename__ = 'cities'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64))
    state_id = db.Column(db.Integer, db.ForeignKey('states.id'))   
    state = db.relationship(State, backref='state')


class User(UserMixin, db.Model):
    ...
    city_id = db.Column(db.Integer, db.ForeignKey('cities.id'))
    city = db.relationship('City', backref='city')

フォームは次のようになりました。

class UserEditForm(FlaskForm):
    ...
    state = SelectField("state", coerce=int)
    city = SelectField("city", coerce=int)
    ....

  def __init__(self, state_id, *args, **kwargs):
       super(UserEditForm, self).__init__(*args, **kwargs)
       self.state.choices =  [(state.id, state.name)
                        for state in State.query.order_by('name').all()]
       self.city.choices = [(city.id, city.name)
                            for city in   City.query.filter_by(state_id=state_id).order_by('name').all()]   

ビューは次のようになりました。

@dashboard.route('/useredit', methods=['GET', 'POST'])
@login_required
def useredit():
    ....
    user = current_user._get_current_object()       
    form = OrganEditForm(state_id=user.city.state_id, state=user.city.state_id, city=user.city_id)
     ....

それはうまく機能し、Selectfield のデフォルト値を正しく設定します。しかし、私は次のようにコードを変更しました:

ビューで:

@dashboard.route('/useredit', methods=['GET', 'POST'])
    @login_required
    def useredit():
        ....
        user = current_user._get_current_object()       
        form = OrganEditForm(obj=user)
         ....

フォームで

def __init__(self, *args, **kwargs):
       super(UserEditForm, self).__init__(*args, **kwargs)
       self.state.choices =  [(state.id, state.name)
                        for state in State.query.order_by('name').all()]
       self.city.choices = [(city.id, city.name)
                            for city in   City.query.filter_by(state_id=kwargs['obj'].city.state_id).order_by('name').all()] 

ただし、今回は都市のデフォルト値が設定されていません。私はこのようにフォームを変更しました:

def __init__(self, *args, **kwargs):
           kwargs['city'] = kwargs['obj'].city_id
           super(UserEditForm, self).__init__(*args, **kwargs)
           self.state.choices =  [(state.id, state.name)
                            for state in State.query.order_by('name').all()]
           self.city.choices = [(city.id, city.name)
                                for city in   City.query.filter_by(state_id=kwargs['obj'].city.state_id).order_by('name').all()] 

しかし、うまくいきませんでした。私は多くの解決策を試しましたが、最後に市の変数名を usercity に変更しました:

usercity= SelectField("city", coerce=int)

そしてkwargs['city'] = kwargs['obj'].city_idkwargs['usercity'] = kwargs['obj'].city_id。それが正しく機能した後。

問題は、設定すると、モデルで定義したobj=user都市選択フィールドのデフォルト値が読み取られることでした。kwargs['obj'].cityuser

于 2019-03-19T18:12:49.327 に答える