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 ...
随机推荐
- pku 1330 Nearest Common Ancestors LCA离线
pku 1330 Nearest Common Ancestors 题目链接: http://poj.org/problem?id=1330 题目大意: 给定一棵树的边关系,注意是有向边,因为这个WA ...
- tp的秘密
入口文件index.php define('APP_DEBUG',True); 改为false* memory_get_usage 获取本套系统目前内存* tp框架中ThinkPHP\Library\ ...
- Hibernate学习(二)关系映射----基于外键的单向一对一
事实上,单向1-1与N-1的实质是相同的,1-1是N-1的特例,单向1-1与N-1的映射配置也非常相似.只需要将原来的many-to-one元素增加unique="true"属性, ...
- 完整教程--idea使用git进行项目管理
第一部分: 安装 1. 下载地址: https://git-scm.com/download/win; 如果速度慢, 使用 迅雷下载; 2. 点击安装, 然后下一步, 直到下面这个页面: 建议: 按 ...
- Hibernate框架进阶(下篇)之查询
导读 Hibernate进阶篇分为上中下三篇,本文为最后一篇,主要内容是Hibernate框架的查询,主要包括hql语句查询,criteria查询以及查询策略的选择. 知识框架 Hibernate查询 ...
- SALM入门笔记(1):特征点的匹配
SLAM 主要分为两个部分:前端和后端,前端也就是视觉里程计(VO),它根据相邻图像的信息粗略的估计出相机的运动,给后端提供较好的初始值.VO的实现方法可以根据是否需要提取特征分为两类:基于特征点的方 ...
- quzrtz的使用
Quartz是一个大名鼎鼎的Java版开源定时调度器,功能强悍,使用方便. 一.核心概念 1.Job 表示一个工作,要执行的具体内容,此接口只有一个方法 void execute(JobExecuti ...
- 一行代码搞定ThoughtWorks面试题
今天在微博看到一道有趣的题目.作为python的脑残粉,自然手痒. 题目在这里. FizzBuzzWhizz 你是一名体育老师.在某次课距离下课还有五分钟时,你决定搞一个游戏.此时有100名学生在上课 ...
- SSH Secure Shell显示serverTomcat后台内容
作为linux小白,仅仅有学一点记一点了: 部署server的时候.常常须要向本地一样查看控制台输出,在linux上能够通过查看日志输出替代,当然也能够通过命令让日志实时显示在命令窗体,这对用惯了wi ...
- Liunx的常用命令
常用指令 ls 显示文件或目录 -l 列出文件详细信息l(list) -a 列出当前目录下所有文件及目录,包括隐藏的a(all) mkdir 创建目录 -p 创建目录,若无父目录,则创建p(paren ...