Django_调查问卷
1、问卷的保存按钮
前端通过ajax把数据发过来后端处理数据,然后返回给前端
2、对问卷做答
首先用户进行登录,验证
条件:1、只有本班的学生才能对问卷做答
2、已经参加过的不能再次访问
在前端显示的样式
显示当前问卷的问题
分为(单选,多选,打分,文本)(多选未做)
- 你对近期的工作有哪些意见、。?
1 2 3 4 5 。。 10
- 路宁女朋友一些建议?
文本...
- 路宁选择帽子颜色?
A. 绿色 B.翠绿
C. 墨绿 D.深绿色
问卷的保存按钮涉及到的知识点:
集合的操作:
s = [1,4,5,8]
s2 = [2,4,7,8,6]
print(set(s).difference(s2)) #做差集,在s中找和s2不同的元素 {1, 5}
print(set(s2).difference(s)) #做差集,在s2中找和s不同的元素 {2, 6, 7}
print(set(s)-set(s2)) #这种方式和上面的一样 {1, 5}
print(set(s2)^set(s)) #交集 {1, 2, 5, 6, 7}
print(set(s2)|set(s)) #并集 {1, 2, 4, 5, 6, 7, 8}
# def outer():
# a=1
# def inner():
# for b in range(10):
# yield a
#
# return inner()
# for i in outer():
# print(i)
# class P:
# pass
# print('type(P)---',type(P))
# print('P.__name__===',P.__name__)
#
# f = type('W',(object,),{})
# print('type(f)---',type(f))
# print('f.__name__===',f.__name__)
# x = set('pwf')
# y = set('pwf123')
#
# print(y - x) # {'2', '3', '1'}
# print(x - y) # set()
# l = []
# d = {'option_1': '2', 'option_2': '4', 'val_3': '4', 'text_4': '123123123213213213213'}
# for k,v in d.items() :
# # print('k',k,'v',v)
# key,qid = k.rsplit('_',1)
# # print(key,qid)
# answer_dict = {'stu_id': id, 'que_id': qid, key: v}
# print(answer_dict)
# l.append(answer_dict)
# print(l)
进入正题:
表的设计:
from django.db import models
# Create your models here.
class UserInfo(models.Model):
'''
员工表
'''
name = models.CharField(max_length=12)
password = models.CharField(max_length=32)
def __str__(self):
return self.name
class ClassList(models.Model):
'''
班级表
'''
title = models.CharField(max_length=32,verbose_name='班级名称')
def __str__(self):
return self.title
class Student(models.Model):
'''
道友表
'''
name = models.CharField(max_length=12,verbose_name='道友姓名')
password = models.CharField(max_length=24,verbose_name='道友密码')
classlist = models.ForeignKey(to=ClassList,verbose_name='道友所在班级')
def __str__(self):
return self.name
class QuestionNaire(models.Model):
'''
问卷表
'''
title = models.CharField(max_length=64,verbose_name='问卷标题')
classlist = models.ForeignKey(to=ClassList,verbose_name='答问卷的班级')
creator = models.ForeignKey(to=UserInfo,verbose_name='创建问卷的辣个银')
def __str__(self):
return self.title
class Question(models.Model):
'''
问题表
'''
caption = models.CharField(max_length=64,verbose_name='问题')
question_type = (
(1,'打分'),
(2,'单选'),
(3,'评价'),
)
tp = models.IntegerField(choices=question_type)
questionnaire = models.ForeignKey(to=QuestionNaire,verbose_name='该问卷下的问题',default=1)
def __str__(self):
return self.caption
class Option(models.Model):
'''
单选题的选项
'''
option_name = models.CharField(max_length=32,verbose_name='选项名称')
score = models.IntegerField(verbose_name='选项对应的分值')
question = models.ForeignKey(to=Question,verbose_name='所在的问题')
def __str__(self):
return self.option_name
class Answer(models.Model):
'''
Answer my questions
'''
val = models.IntegerField(verbose_name='打分项的得分',null=True,blank=True)
content = models.CharField(max_length=255,null=True,blank=True,verbose_name='评价')
student = models.ForeignKey(to=Student,verbose_name='哪位道友答的题')
question = models.ForeignKey(to=Question,verbose_name='答的是哪道题')
option = models.ForeignKey(to=Option,verbose_name='单选选项',null=True)
def __str__(self):
return self.val
form相关:
这里我们用到form & modelform来操作页面验证。
需要注意的是: 这里添加问卷时,需要实时显示我们添加的东西哦。
看代码:
from django.forms import Form #代表类的基类
from django.forms import fields #代表字段
from django.forms import widgets #插件
from django.forms import ModelForm #代表数据库和form可以一起用
from app01 import models
class QuestionNaire_Form(Form):
'''添加页面的Form验证'''
title = fields.CharField(required=True,max_length=64,
error_messages={
'required' : '问卷标题不可以为空!',
'max_length' : '超过最大长度'
},
widget=widgets.Textarea(attrs={'placeholder':'请输入问卷标题','type':'text','style':'width:80%;height:100px;','class':'form-control qn_title'}))
classlist = fields.ChoiceField(required=True,initial=1,
error_messages={'required':'请选择班级'},widget=widgets.Select)
# fields.RegexField()
# 实时更新问卷列表
def __init__(self,*args,**kwargs):
super(QuestionNaire_Form, self).__init__(*args,**kwargs)
self.fields['classlist'].choices = models.ClassList.objects.values_list("id","title")
class QuestionModelForm(ModelForm):
class Meta:
model = models.Question
fields = ['caption','tp'] #这两行代表 拿到当前表所有的字段
#这个fields 是按照models里面写的字段格式在前端页面生成相应的东西.
widgets={'caption':widgets.Textarea(attrs={'style':'width:600px;height:80px','class':'form-control','placeholder':'请输入问题名称'})}
class OptionModelForm(ModelForm):
class Meta:
model = models.Option
fields = ['option_name','score']
然后进入到我们的views页面:
"""
思路分析:
拿到前端的数据,像下面这种格式的
如果是json格式发的,注意要在request.body中取值。
ajax_post_list = [
{
'id': 2,
'caption': "你到底爱不爱我??",
'tp': 1,
},
{
'id': None,
'caption': "你爱我什么?",
'tp': 3
},
{
'id': None,
'caption': "what do u say daring?",
'tp': 2,
"options": [
{'id': 1, 'name': '绿', 'score': 10},
{'id': 2, 'name': '翠绿', 'score': 8},
]
},
]
前端的数据和数据库的数据进行比较,
- 前端有后端没有要添加
- 前端没有后端有要删除
- 前端有后端也有要更新
"""
def eva_stu(request,class_id,qn_id):
stu_obj = models.Student.objects.filter(id=request.session.get("stu_info").get("stu_id"),classlist_id=class_id).first()
# 1. 先看是否是本班学生
if not stu_obj:
return HttpResponse('您不配啊!!!')
# 2. 看它是否已经答过问卷
ans_obj = models.Answer.objects.filter(student_id=stu_obj.id,question__questionnaire_id=qn_id).count()
if ans_obj:
return HttpResponse('别闹! 您已经答过了啊')
# 3. 拿到所有的问题并显示
from django.forms import Form,fields,widgets
que_list = models.Question.objects.filter(questionnaire_id=qn_id).all()
field_dict = {}
for que in que_list:
if que.tp == 1: # 打分用chioce
field_dict['val_%s' % que.id] = fields.ChoiceField(
label = que.caption,
required=True,
error_messages={'required' : '不能为空哦'},
widget=widgets.RadioSelect,
choices=[ (i,i) for i in range(1,11) if i ]
)
elif que.tp == 2 : # 单选
field_dict['option_%s' % que.id] = fields.ChoiceField(
required=True,
label = que.caption,
error_messages={'required':'必选'},
choices = models.Option.objects.filter(question_id=que.id).values_list('id','option_name'), #为什么改成values_list就可以显示选项
widget = widgets.RadioSelect
)
else :
field_dict['text_%s' % que.id] = fields.CharField(
required=True,
label = que.caption,
widget = widgets.Textarea,
validators=[func,]
)
# print("field_dict",field_dict)
# 创建类,并实例化
# print('field_dict======',field_dict)
MyAnswerForm = type('MyAnswerForm', (Form,),field_dict)
if request.method == 'GET':
form = MyAnswerForm()
return render(request,'eva_stu.html',{'form':form})
else:
form = MyAnswerForm(request.POST)
if form.is_valid():
print(form.cleaned_data)
# {'option_1': '2', 'option_2': '4', 'val_3': '4', 'text_4': '123123123213213213213'}
l = []
for key,v in form.cleaned_data.items():
k,qid = key.rsplit('_',1)
answer_dict = {'student_id':stu_obj.id,'question_id':qid,k:v}
print(answer_dict)
# l1 = l.append(answer_dict)
l.append(models.Answer(**answer_dict))
print(77777)
# models.Answer.objects.bulk_create()
return HttpResponse('ok')
return render(request,'eva_stu.html',{'form':form})
# 自定义form验证
from django.core.exceptions import ValidationError
def func(val):
if len(val) < 15 :
raise ValidationError(' duan duan duan ')
显示问卷内容并且拿到提交后的问卷答案
end...
Django_调查问卷的更多相关文章
- "琳琅满屋"调查问卷 心得体会及结果分析
·关于心得体会 当时小组提出这个校园二手交易市场的时候,就确定了对象范围,仅仅是面向在校大学生,而且在我们之前就已经有了很多成功的商品交易的例子可以让我们去借鉴,再加上我们或多或少的有过网 ...
- JavasScript实现调查问卷插件
原文:JavasScript实现调查问卷插件 鄙人屌丝程序猿一枚,闲来无事,想尝试攻城师是感觉,于是乎搞了点小玩意.用js实现调查问卷,实现了常规的题型,单选,多选,排序,填空,矩阵等. 遂开源贴出来 ...
- 关于“Durian”调查问卷的心得体会
这周我们做了项目着手前的客户需求调查,主要以调查问卷的方式进行.其实做问卷调查并不是想象中的那么简单,首先要确定问卷调查的内容,每一个问题都要经过深思熟虑,字字斟酌,既要切合问卷主要目的,又要简洁扼要 ...
- 从Adobe调查问卷看原型设计工具大战
近年国内外原型设计工具新品频出,除了拥趸众多的老牌Axure在RP 8之后没有什么大的动作,大家都拼了命地在出新品.今天 inVision 的 Craft 出了 2.0 的预告视频,明天 Adobe ...
- Scrum立会报告+燃尽图(十一月十七日总第二十五次):设计调查问卷;修复上一阶段bug
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2284 项目地址:https://git.coding.net/zhang ...
- <问吧>调查问卷心得体会
<问吧>调查问卷心得与体会 在这之前,我们已经组成了一个六个人的小团队---“走廊奔跑队”,我们这次做的这个项目的名称是:问吧.在项目实施之前,我们必做的一步就是需求分析,目的就是充分了解 ...
- android 实现调查问卷-单选-多选
非常久没写东西了.今天来总结下有关android调查问卷的需求实现. 转载请加地址:http://blog.csdn.net/jing110fei/article/details/46618229 先 ...
- 自动化测试调查问卷送《QTP自动化测试最佳实践》
自动化测试调查问卷送<QTP自动化测试最佳实践> http://automationqa.com/forum.php?mod=viewthread&tid=2308&fro ...
- HDU - 6344 2018百度之星资格赛 1001调查问卷(状压dp)
调查问卷 Accepts: 1289 Submissions: 5642 Time Limit: 6500/6000 MS (Java/Others) Memory Limit: 262144 ...
随机推荐
- sublime text 3 ctrl+b浏览器启动html
sublime text 2 和3 都可以快速设置浏览器启动,本人在这里介绍如何不下插件启动浏览器.第一步:打开Tool-->build system ---> new build sy ...
- js 深拷贝和浅拷贝
js 深拷贝和浅拷贝 先举一下项目中遇到的两个例子: 例子1: var json = $.parseJSON(data.data);//data.data是接口返回的值var a = json.cha ...
- java环境变量配置原理解析以及eclipse导入外包的方法
1. PATH环境变量.作用是指定命令搜索路径,在命令行下面执行命令如javac编译java程序时,它会到PATH变量所指定的路径中查找看是否能找到相应的命令程序.我们需要把jdk安装目录下的bin目 ...
- 在websphere上部署集群应用程序-工作记录
1) 创建web集群.client集群,添加集群托管节点,根据需求来,我的需求是两个应用部署到4个服务器上,属于1主3备模式 2) 创建webspere变量:选择你需要的集群作用域,新建资源 (作 ...
- Chromium与CEF的多进程模型及相关參数
CEF基于Chromium,也是多进程模型.关于进程模型.參考这里:https://www.chromium.org/developers/design-documents/process-model ...
- 天津政府应急系统之GIS一张图(arcgis api for flex)解说(三)显示地图坐标系模块
config.xml文件的配置例如以下: 1 2 <widget left="3" bottom="3" config="widgets/Coo ...
- Android 夜间模式changeskin小结
@author vivian8725118 @CSDN http://blog.csdn.net/vivian8725118 @简书 http://www.jianshu.com/p/832e9776 ...
- 具体解释Java虚拟机类载入
概述 在Java语言里面,类型的载入.连接和初始化过程都是在程序运行期间完毕的.虚拟机把描写叙述类的数据从Class文件或其他地方载入到内存,并对数据进行校验.转换解析和初始化,终于形成能够被虚拟机直 ...
- 前端MVC Vue2学习总结(一)——MVC与vue2概要、模板、数据绑定与综合示例
一.前端MVC概要 1.1.库与框架的区别 框架是一个软件的半成品,在全局范围内给了大的约束.库是工具,在单点上给我们提供功能.框架是依赖库的.Vue是框架而jQuery则是库. 1.2.AMD与CM ...
- 数学之美?编程之美?数学 + 编程= unbelievable 美!
欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 作者:Rusu 导语 相信大家跟我一样,偶尔会疑惑:曾经年少的时候学习过的那么多的复杂的数学函数,牛逼的化学方程式,各种物理原理.公式,到底有 ...