跳转到主要内容

Questions是一个使用SurveyJS UI能力的表单库。

项目描述

Questions

https://img.shields.io/pypi/v/questions.svg https://github.com/cguardia/questions/workflows/continuous-integration/badge.svg Documentation Status

Questions是一个Python表单库,它使用SurveyJS UI的能力。Questions背后的哲学是,现代表单渲染通常需要集成一些复杂的JavaScript小部件,那么为什么不完全跳过标记生成呢?

https://www.delaguardia.com.mx/questions.gif

在Questions中,表单以Python定义,类似于其他表单框架,但前端的所有内容都由SurveyJS处理。这提供了很多好处

  • 优雅的集成UI,具有强大的JavaScript小部件。

  • SurveyJS与Angular2、JQuery、KnockoutJS、React和VueJS兼容。Questions确保您为每个版本获取正确的文件。

  • 超过20种问题类型,从简单的文本输入和下拉列表到复杂的动态面板和复选框矩阵等小部件。

  • 多种外观和感觉选项(主题),包括Bootstrap CSS支持。

  • 完整的客户端验证(加上服务器端检查)。

  • 在问题声明中使用简单的文本表达式来控制根据前一个问题答案显示哪些问题。

  • 使用类组合轻松定义复杂表单。

  • 简单的多页表单,无需保持状态。

  • 使用SurveyJS表单创建器直接从JSON定义创建表单。

  • 从动态JSON导入生成Python代码。

  • 简单应用的极简代码。如果你只需要一个或两个表单,那就足够了。

  • 零JavaScript代码选项。如果你可以使用CDN,则无需安装或下载任何JavaScript。

  • 与流行的第三方小部件(如select2ckeditor)开箱即用集成。

  • 支持创建测试和测验,通过定义问题的“正确”答案,并可选地设置完成的最大时间。

代码看起来如何

要了解Questions如何工作,没有比看一个简单示例更好的方法了

from questions import Form
from questions import TextQuestion
from questions import RadioGroupQuestion


class SimpleForm(Form):
    name = TextQuestion()
    email = TextQuestion(input_type="email", required="True")
    favorite_number = TextQuestion(title="What is your favorite number?",
        input_type="number")
    language = RadioGroupQuestion(title="Favorite Language",
        choices=["Python", "Other"])
    version = RadioGroupQuestion(title="Preferred Python Version",
        choices=["Python 2", "Python 3"],
        visible_if="{language} = 'Python'")

这是一个相当传统的定义表单的方法,所以这里没有惊喜,但请注意参数的使用方式,它允许我们使用不同的HTML5文本输入方法。特别关注最后一行,我们在这里使用参数只在问题的答案是“Python”时显示Python版本问题。以这种方式定义“实时”表单行为通常是服务器端代码之外的范畴,但Questions的SurveyJS集成允许我们做到这一点。

完整的多页Flask应用程序

让我们看看如果您的应用程序需求简单,事情会多么简单。以下是一个使用流行的Flask Web框架的完整应用程序

from flask import Flask
from flask import redirect
from flask import request

from questions import Form
from questions import FormPage
from questions import TextQuestion
from questions import DropdownQuestion


class PageOne(Form):
    name = TextQuestion()
    email = TextQuestion(input_type="email", required="True")


class PageTwo(Form):
    country = DropdownQuestion(choices_by_url={"value_name": "name",
        "url": "https://restcountries.eu/rest/v2/all"})
    birthdate = TextQuestion(input_type="date")


class Profile(Form):
    page_one = FormPage(PageOne, title="Identification Information")
    page_two = FormPage(PageTwo, title="Additional Information")


app = Flask(__name__)

@app.route("/", methods=("GET",))
def form():
    form = Profile()
    return form.render_html()

@app.route("/", methods=("POST",))
def post():
    form_data = request.get_json()
    # Here, we would save to a database or something
    print(form_data)
    return redirect("/thanks")

@app.route("/thanks")
def thanks():
    return "Thanks for your information"

if __name__ == "__main__":
    app.run()

默认情况下,Questions使用CDN获取JavaScript资源,这就是为什么运行上述代码所需的所有东西就是安装Flask和Questions。当然,你可以自己安装所有依赖项并配置Questions以使用你的安装,但有时这已经足够让你得到一个完整的工作应用程序。

诚然,我们的应用程序没有什么大不了的,但我们得到了一个可以在浏览器中填写和提交的工作表单。看看获取带导航按钮的多页表单有多简单。请注意是获取表单数据的唯一Flask请求调用。

如代码所示,定义多页表单非常简单,使我们能够逻辑上分离表单页面,甚至使用它们,与其他表单独立或组合,只需额外的工作。

最后,看看DropdownQuestion中的参数,它允许我们从单独的RESTful Web服务获取下拉选项。

许可证和文档

鸣谢

这个包是用Cookiecutteraudreyr/cookiecutter-pypackage项目模板创建的。

历史

0.5.0a0 (2020-10-01)

  • 首次发布在PyPI。

0.5.0a1 (2020-12-09)

  • 修复了当在单个表单中使用两个或多个面板时导致Questions崩溃的错误。

  • 添加了从JSON数据创建表单子类的新功能。

  • 将屏幕截图添加到README页面。

  • 更新文档。

  • 更新依赖项到最新版本。

0.5.0a2 (2020-12-09)

  • 修复了

    参数在from_json转换中的错误。

0.5.0a3 (2020-12-10)

  • 确保manifest中包含jinja模板。

0.7.0a4 (2020-12-13)

  • 更新安装文档,以提及Python < 3.8的typing-extensions要求。

  • 在签名板中为allow_clear设置正确的默认值。

  • 设置类型提示,允许在可见文本属性中使用本地化数组。

  • 修复了从具有动态面板的JSON生成类时的错误。

  • 为主要类添加字符串表示方法。

  • 功能:为使用from_json方法创建的类添加生成代码的console脚本。

0.7.1 (2022-09-18)

  • 错误修复:当其他页面已定义时,不要添加默认页面。

  • 更新js CDN和测试。

0.8.0 (2023-04-10)

  • 错误修复:修复具有可翻译文本的选择(感谢@joan-qida)。

  • 错误修复:修复read the docs构建。

  • 更新SurveyJS版本。

  • 使用当前SurveyJS支持的主题。

  • 在测试中包含更新的Python版本。

  • 添加国际化(i18n)文档。

  • 各种依赖项更新。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分布

questions-0.8.0.tar.gz (51.6 kB 查看哈希)

上传时间:

构建分布

questions-0.8.0-py2.py3-none-any.whl (32.5 kB 查看哈希)

上传时间: Python 2 Python 3

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页