一个用于创建在线问卷/调查的Django应用程序。
项目描述
FEF问卷
简介
FEF问卷是一个Django问卷应用程序,易于定制,并支持使用布尔表达式的高级依赖性。
它允许管理员在Django管理界面中创建和编辑问卷,支持多种语言。
它可以作为一个通过电子邮件征求主题的调查运行,也可以作为一个基于网络的投票。
在任一模式下,一个实例都可以通过django content-types模块与任意对象链接。
在Unglue.it页面上尝试问卷,以“开放获取电子书”为主题 https://unglue.it/work/82028/
历史
问卷应用程序最初由Seantis开发,它本身是从rmt派生出来的。Eldest Daughter接手了项目,并将其命名为ED-questionnaire,因为他们一直在使用它,而Seantis版本已经进入了一个稳定的开发状态。他们想要几个功能更改,并决定自己负责维护。
旧版本被标记如下
- 标记 1.0 - 原开发者(rmt)最后提交的状态
- 标记 1.1 - 包含其他分支对原始版本改进的合并更改
- 标记 2.0 - 原始的Seantis版本更新后的主分支
- 标记 2.5 - 包含原始的Seantis版本以及截至2015年12月9日合并的所有PR。它被认为是存储库的向后兼容版本。
“ED问卷”版本被命名为v3.0。它与v2.x分支不兼容。
“FEF问卷”版本是为了在书数据库中将问卷链接到单个书籍而创建的。我们将称之为v4.0。应用得到了全面的改造和更新。这项工作由梅隆基金会资助,作为《免费电子书供应链映射项目》的一部分。
关于本手册
迄今为止,问卷并不是一个文档记录良好的应用。本手册应该能给您提供一个关于其布局和概念的总体了解,但请帮助我们改进它。
它涵盖的内容包括以下方面
- 集成介绍了创建新的Django应用以及问卷所需的步骤。相同的步骤也可以用来将问卷集成到现有站点中(尽管你会走一些未铺路的路)。
- 概念讨论了数据模型和应用程序的设计。
- 迁移解释了如何使用1.0定义的问卷在2.0中使用。
- 2.0 剖析讨论了在2.0开发过程中的一些经验。
集成
安装
如果您只想安装,请从以下开始
pip install fef-Questionnaire
示例设置
本部分文档将向您展示从头开始创建问卷应用的步骤。对于将问卷集成到现有站点中,它也应该非常有用。
首先,为您的新站点创建一个文件夹
mkdir site
cd site
创建一个虚拟环境,以确保您的Python包不会影响系统
virtualenv --no-site-packages -p python3.6 .
激活您的虚拟环境
source bin/activate
安装Django
pip install django==2.2.16
创建您的Django站点
django-admin.py startproject example
为问卷创建一个位置
cd example
mkdir apps
cd apps
克隆问卷源
git clone git://github.com/EbookFoundation/fef-questionnaire.git
现在您应该在您的应用文件夹中有了一个fef-questionnaire文件夹
cd fef-questionnaire
下一步是安装问卷。
python setup.py install
如果您正在使用您自己的分支中的ed-questionnaire,您可能希望使用python setup.py develop
,这样每次问卷发生变化时,您就无需运行python setup.py install
。
现在让我们配置基本问卷,或者将“example”文件夹中的settings.py、urls.py和models.py文件复制到example/example
中,然后跳到初始化数据库。
此外,将区域和请求缓存中间件添加到MIDDLEWARE_CLASSES
'questionnaire.request_cache.RequestCacheMiddleware'
将问卷模板目录以及您自己的添加到TEMPLATES
'DIRS': [os.path.join(BASE_DIR, 'example/templates/')],
如果您想使用多种语言,将i18n上下文处理器添加到TEMPLATES 'context_processors': ['django.template.context_processors.i18n',]
现在将transmeta
、questionnaire
添加到您的INSTALLED_APPS
'transmeta',
'questionnaire',
'questionnaire.page',
要完成设置,请添加fef-questionaire特定的参数。在我们的示例中,我们将使用
QUESTIONNAIRE_PROGRESS = 'async'
QUESTIONNAIRE_USE_SESSION = False
QUESTIONNAIRE_ITEM_MODEL = 'example.Book'
QUESTIONNAIRE_SHOW_ITEM_RESULTS = True
接下来,我们要编辑项目的urls.py
文件,将问卷视图链接到您站点的URL配置。示例应用将向您展示如何操作。
最后,我们想向示例应用添加一个模型,以便我们将问卷链接到。它需要一个名为“items”的反向关系
class Book(models.Model):
title = models.CharField(max_length=1000, default="")
landings = GenericRelation(Landing, related_query_name='items')
def __unicode__(self):
return self.title
初始化数据库
完成这些后,我们可以初始化我们的数据库。(为了使此功能正常工作,您必须在settings.py
中设置您的DATABASES。)。首先,在您的CLI中导航回example
文件夹
cd ../..
检查您是否在正确的文件夹中,输入ls
:如果您可以看到列表中的manage.py
,您就做好了。否则,找到包含该文件的文件夹。然后输入
python manage.py migrate
您将被要求创建一个超级用户。
问卷期望存在一个base-questionnaire.html
模板,其中包含某些样式表和块。如果您正在将应用程序添加到现有项目中,请查看./apps/fef-questionnaire/example/templates/base-questionnaire.html
。
恭喜您,您已经设置了问卷的基础!到目前为止,这个网站实际上并没有做什么,因为没有定义任何问卷。
国际化数据库
首先,您需要设置问卷中使用的语言。使用您喜欢的文本编辑器打开您的example
文件夹。
打开example/example/settings.py
并添加以下行,表示您选择的语言
LANGUAGES = (
('en', 'English'),
('de', 'Deutsch')
)
现在,您需要
python manage.py makemigrations
python manage.py migrate
如果您想使用多种语言,将i18n上下文处理器添加到TEMPLATES 'context_processors': ['django.template.context_processors.i18n',]
并按照Django翻译文档中的描述设置中间件
要查看示例问卷,您可以执行以下操作(注意:此操作仅当您在settings.py
中将英语和德语定义为语言时才有效)
python manage.py loaddata ./apps/fef-questionnaire/example/fixtures/example.yaml
python manage.py loaddata ./apps/fef-questionnaire/example/fixtures/books.yaml
启动服务器!
启动您的开发服务器
python manage.py runserver
然后导航到localhost:8000。
首先,转到管理控制台并登录。否则,您将无法将问卷链接到项目。
选择一个问卷。"Example"有英语和德语翻译。"MappingSurvey"只有英语。
概念
ED问卷有以下表格,下面将详细介绍。
- 主题
- 运行信息
- 运行信息历史
- 问题
- 选择
- 问题集
- 问卷
- 答案
- 着陆
主题
主题是填写问卷的人。
主题主要用于参与者反复回答问卷的研究中。在这种情况下,可以输入主题。进行研究的任何人(即运行问卷应用程序的人)可以定期发送电子邮件邀请主题填写问卷。
发送电子邮件将在后面详细说明。
当然,并非每个问卷都是研究的一部分。有时你只是想知道人们认为哪个更酷:海盗还是忍者*?
*(是海盗!)
虽然民意调查是这个例子更好的选择,但可以通过使用匿名主题来使用ED问卷找到问题的答案。下一章问卷将更详细地讨论这个问题。
运行信息
运行信息指的是主题当前活动的运行。
目前正在填写问卷的主题被认为是处于运行中。运行信息指的是该运行并包含有关该运行的信息。
与运行信息关联的最重要信息是主题,一个用于生成问卷唯一URL的随机值,已回答问题的结果和进度。
一旦运行结束,它将被删除,部分信息将被带到运行信息历史记录中。
运行可以通过任意数量的逗号分隔的标签进行标记。如果使用标签,则可以设置问题仅在给定标签是运行信息的一部分时显示。
运行信息历史
运行信息历史用于引用一组答案。
问题
问题是您想要向主题提出的问题。您可以使用多种类型
- 选择-是或否 - 是或否
- 选择-是或否评论 - 是或否,有机会评论答案
- 选择-是或否不知道 - 是或否或Whaaa?
- 开放 - 一个简单的单行输入框
- 开放文本框 - 一个用于长答案的框
- 选择 - 一个可以从中选择的选项列表
- 选择-自由形式 - 一个可以从中选择选项的列表,有机会输入其他内容
- 选择-多选 - 一个可以多选的选项列表
- 选择-多选自由形式 - 多个答案,有多个用户定义的答案
- 范围 - 一个可以从中选择一个数字的数字范围
- 数字 - 一个数字
- 时间段 - 一个时间段
- 自定义 - 使用自定义模板的自定义问题
- 注释 - 不是一个问题,而只是在用户界面显示的注释
- 相同类型 - 与另一个问题的相同类型
**其中一些类型取决于检查或选择。例如,数字问题可以通过将检查设置为类似于 range=1-100 step=1
的方式来控制。范围问题也可以使用前面提到的检查,以及 unit=%
。其他问题,如多选自由表单问题,如果需要向用户提供十个额外选项,则需要 extracount=10
。
我很想在这里详细介绍,但我没有那么多时间,所以我唯一的选择是恳请您参考处理所有问题类型的 qprocessor 子模块。
接下来是问题编号。问题编号定义了当同一页面上显示多个问题时,问题的字母数字顺序。此编号也用于引用问题。
问题文本是用户将被询问的内容。可以为在 settings.py
文件中定义的每种语言提供一个文本。
额外信息是显示给用户的附加信息。到目前为止,并非所有问题都支持此功能,但大多数问题都支持。
问题(及其父级,问题集)的一个重要方面是检查字段。检查字段执行了许多操作(可能太多),其中最重要的是定义是否应将特定问题或问题集显示给当前主题。
问题上的最重要的检查如下
- 必填 必填问题必须由用户回答
- requiredif="number,answer" 表示如果编号为 number 的问题等于 answer,则此问题为必填。
- shownif 与 requiredif 相同,但定义问题是否显示。
- 仅限男性 仅向男性主题显示
- 仅限女性 仅向女性主题显示
- iftag="tag" 如果在 RunInfo 中存在给定的标签,则仅显示问题
检查允许使用简单的布尔表达式,如下所示:iftag="foo or bar"
或 requiredif="1,yes and 2,no"
选择
选择是多项选择题的可能值。
问题集
一组问题构成一个问题集。问题集最终是一页的问题。同一问题集中的问题将在同一页上显示。
问题集也有检查,与问题的选项相同。只有一个区别,required 和 requiredif 不起作用。
不包含可见问题(如 shownif 定义)的问题集将被跳过。
答案
包含问题的答案。答案的值存储为 JSON。
问卷
问卷是一组问题集。
着陆
在投票模式下,着陆 URL 将问卷链接到一个对象,将用户链接到一个主题。如果您有一个您想要提问的数据库,这将很有用。
从 1.x 迁移到 2.0
版本 4.0 不支持从 1.X 数据文件迁移。
2.0 后期分析
2.0 是我们在 Seantis 问卷调查中为我们的第二个项目投入工作后的结果。我们没有问卷创建者的帮助就完成了这个项目,当时我们几乎完全独立。
以下是我们的学习成果
问卷是一个框架
除此之外,ed.questionnaire 应该被视为一个框架。您的网站必须提供并执行某些操作以确保问卷正常工作。如果您的网站是针对同一网站上有其他需求的公司的定制问卷,您最终将集成代码来调用问卷以设置运行,并且您可能会通过答案记录来提供某种总结。
如果它是一个库,您可以直接使用一个API,但这不存在。
不要在检查上疯狂
我们在问题集和问题中使用了相当数量的检查来控制复杂的问卷。我们将问卷的复杂性卸载到客户定义的Excel文件中,并生成检查以将这种复杂性复制到我们的应用程序中。
尽管这种方法确实可以正常工作,但它并不提供良好的性能。问题是,如果您有由运行信息标签控制的上百个问题,那么在每次请求中,您将花费大量的CPU周期来计算进度条。这正是我们实现 QUESTIONNAIRE_PROGRESS 设置的原因(您可以通过查看 example/settings.py 来了解更多信息)。
我们通过在页面渲染后使用 AJAX 来绘制进度条,成功地保持了渲染时间较低。但这只是一种权宜之计。在大型问卷中计算运行进度仍然是一项繁重的操作,因此对于非常大的问卷,您可能需要考虑完全删除进度条。还有一些优化可以完成,但本质上它将仍然是问卷中最慢的部分,因为最终解释大量的检查不是一件可以快速完成的事情,除非您的名字是 PyPy,并且您的程序员具有非凡的才华。
测试不足
有几个进行了简单的测试,但还需要更多。更多的测试也意味着可以进行更多的重构,这将很好,因为确实需要进行一些重构。
管理界面不够好
Django 管理员是一个很好的特性,但我们要么没有充分利用它,要么它不是问卷的正确工具。无论如何,如果您期望客户与问卷的结构一起工作,您可能需要编写自己的管理界面。当前的界面还不够好。
4.0 更改
4.0 版本尚未测试与先前版本的兼容性。
- 已修复断开的链接。应用程序在会话模式和非常设模式下工作。
- 我们已更新到 Bootstrap 3.3.6 并实现了标签以提高可访问性。
- 添加了“着陆”功能,以便可以将调查响应链接到应用程序中的任意模型。已添加模板标签,允许问题和答案引用这些模型。
- 添加了问题类型,这样就可以在不使问题成为必需的情况下提供选择。
- 改进了必填问题的样式。
- 已修复响应数据的导出。
- 与 Django 1.8 的兼容性。尚未测试与其他版本的 Django 的兼容性。
- 重构了视图。
- 已更新文档以反映 Django 1.8。
- 电子邮件和主题功能尚未测试。
4.0.1
针对 Django 1.11 进行了更新。
5.0
针对 Python 3.6 进行了更新。
6.0
针对 Django 2.0+ 进行了更新。