在Flask WTForms中使用RadioField公开其他表单字段

时间:2020-06-12 16:50:23

标签: flask flask-wtforms wtforms

使用WTForms的新手,我不知道如何显示其他表单字段,如下所示:https://css-tricks.com/exposing-form-fields-radio-button-css/

由于单选字段在提供字段列表的地方具有choices参数,是否有任何方法可以自定义每个选项?选择不同的选择时会暴露出不同的东西吗?

1 个答案:

答案 0 :(得分:0)

这将是python和javascript代码的组合。

2种常见解决方案

  • 网页中已经包含了所有内容,未使用的字段将被隐藏,直到用户采取行动为止(在单选按钮上)。
  • 进行API调用以获取动态的自定义选择。

您可以创建一条路线:

@app.route("/api/choices", methods=["GET"])
def my route:
    custom_choices = get_custom_choices()
    return jsonify(custom_choices)

然后在您的JavaScript代码中,当用户单击按钮时,您会请求此路线以获取自定义选项。

然后,当您检查/验证发送的表单时,按照此处WTForms文档中的描述,使用自定义选项(在示例中为get_custom_choice)填充字段的选择:

请注意,choices关键字仅被评估一次,因此如果需要 要创建动态下拉列表,您需要分配选择 实例化后列出到字段。任何提交的选择是 不在给定的选项列表中将导致在现场验证 失败。如果此选项无法应用于您的问题,您可能希望 跳过选择验证(见下文)。

使用动态选择值选择字段:

class UserDetails(Form):
    group_id = SelectField('Group', coerce=int)

def edit_user(request, id):
    user = User.query.get(id)
    form = UserDetails(request.POST, obj=user)
    form.group_id.choices = [(g.id, g.name) for g in Group.query.order_by('name')]

请注意,我们没有将选择传递给SelectField构造函数,但是 而是在查看功能中创建了列表。还有,coerce关键字 SelectField的arg表示我们使用int()强制转换表单数据。的 默认强制为str()。

Source

第二种解决方案需要做更多的工作,但要轻巧一些,取决于您选择的可能性。 (我认为:更清洁)。