我在烧瓶中的wtforms中使用了字段列表,但是其默认值无法正确呈现。
在下面的示例中,字段列表的min_entries值为1,我通过append_entry()方法添加了两个附加条目。
另外两个条目无法正确呈现,因为它们的值不再是默认值,而是一些混合了html和默认值的难看文本。
目前,我决定在项目中完全不使用字段列表,而是通过min_entries生成固定数量的条目,这意味着我不能使用动态数量的条目。
第一项:true
123
345
第二项:value="[Enter track number]"
文件夹结构:
├──app.py
├──模板
| └──album_add.html
value="<input id="track" name="track" type="text" value="[Enter track number]">"
# Load and initialise flask variables
app = Flask(__name__)
SECRET_KEY = os.urandom(32); app.config['SECRET_KEY'] = SECRET_KEY
bootstrap = Bootstrap(app)
# form
class TrackShortList(FlaskForm):
song_index = SelectField('Select Track')
track_number = StringField('Track number', default='[Enter track number]')
def __init__(self, csrf_enabled=False, *args, **kwargs):
super(TrackShortList, self).__init__(csrf_enabled=csrf_enabled, *args, **kwargs) # required to disable csrf otherwise 'CSRF Token' is displayed
# see https://stackoverflow.com/questions/15649027/wtforms-csrf-flask-fieldlist
class selectTracks(FlaskForm):
tracks = FieldList(FormField(TrackShortList), min_entries=1)
# route
@app.route('/addtrack', methods=['post','get'])
def addtrack():
track_select = [("Select track",)*2, ("A track",)*2, ("Another track",)*2]
form = selectTracks()
for i in range(2):
trackChildForm = TrackShortList()
form.tracks.append_entry(trackChildForm)
for sub_form in form.tracks:
sub_form.song_index.choices = track_select
if form.validate_on_submit():
pass
return render_template('album_add.html', form=form)
答案 0 :(得分:1)
以下路线有效。
区别在于此行trackChildForm.track_number = '[Enter track number]'
,我认为它会覆盖默认的TrackShortList.track_number值。
我通过查看here中解释的类似问题找到了该解决方案。但是我不知道为什么会起作用,因此欢迎进行澄清。
@app.route('/addtrack_working', methods=['post','get'])
def addtrack_working():
track_select = [("Select track",)*2, ("A track",)*2, ("Another track",)*2]
form = selectTracks()
for i in range(2):
trackChildForm = TrackShortList()
trackChildForm.track_number = '[Enter track number]'
form.tracks.append_entry(trackChildForm)
for sub_form in form.tracks:
sub_form.song_index.choices = track_select
if form.validate_on_submit():
pass
return render_template('album_add.html', form=form)
答案 1 :(得分:0)
append_entry 类需要数据,而不是表单。如果未提供数据,则将添加已定义形式的空实例。
对于您的用例来说,就像这样:
track_select = [("Select track",)*2, ("A track",)*2, ("Another track",)*2]
form = selectTracks()
for i in range(2):
form.tracks.append_entry()
for sub_form in form.tracks:
sub_form.song_index.choices = track_select
if form.validate_on_submit():
pass
return render_template('album_add.html', form=form)