1、问卷的保存按钮
  前端通过ajax把数据发过来后端处理数据,然后返回给前端
2、对问卷做答
  首先用户进行登录,验证
  条件:1、只有本班的学生才能对问卷做答
       2、已经参加过的不能再次访问
      
在前端显示的样式
    显示当前问卷的问题

 分为(单选,多选,打分,文本)(多选未做)
    - 你对近期的工作有哪些意见、。?
      1 2 3 4 5 。。 10
    - 路宁女朋友一些建议?
            文本...
    - 路宁选择帽子颜色?
            A. 绿色    B.翠绿
            C. 墨绿    D.深绿色

问卷的保存按钮涉及到的知识点:
集合的操作:
   

  1. s = [1,4,5,8]
  2. s2 = [2,4,7,8,6]
  3. print(set(s).difference(s2)) #做差集,在s中找和s2不同的元素 {1, 5}
  4. print(set(s2).difference(s)) #做差集,在s2中找和s不同的元素 {2, 6, 7}
  5. print(set(s)-set(s2)) #这种方式和上面的一样 {1, 5}
  6. print(set(s2)^set(s)) #交集 {1, 2, 5, 6, 7}
  7. print(set(s2)|set(s)) #并集 {1, 2, 4, 5, 6, 7, 8}
  1. # def outer():
  2. # a=1
  3. # def inner():
  4. # for b in range(10):
  5. # yield a
  6. #
  7. # return inner()
  8. # for i in outer():
  9. # print(i)
  10.  
  11. # class P:
  12. # pass
  13. # print('type(P)---',type(P))
  14. # print('P.__name__===',P.__name__)
  15. #
  16. # f = type('W',(object,),{})
  17. # print('type(f)---',type(f))
  18. # print('f.__name__===',f.__name__)
  19.  
  20. # x = set('pwf')
  21. # y = set('pwf123')
  22. #
  23. # print(y - x) # {'2', '3', '1'}
  24. # print(x - y) # set()
  25.  
  26. # l = []
  27. # d = {'option_1': '2', 'option_2': '4', 'val_3': '4', 'text_4': '123123123213213213213'}
  28. # for k,v in d.items() :
  29. # # print('k',k,'v',v)
  30. # key,qid = k.rsplit('_',1)
  31. # # print(key,qid)
  32. # answer_dict = {'stu_id': id, 'que_id': qid, key: v}
  33. # print(answer_dict)
  34. # l.append(answer_dict)
  35. # print(l)


进入正题:

表的设计:

  1. from django.db import models
  2.  
  3. # Create your models here.
  4. class UserInfo(models.Model):
  5. '''
  6. 员工表
  7. '''
  8. name = models.CharField(max_length=12)
  9. password = models.CharField(max_length=32)
  10.  
  11. def __str__(self):
  12. return self.name
  13. class ClassList(models.Model):
  14. '''
  15. 班级表
  16. '''
  17. title = models.CharField(max_length=32,verbose_name='班级名称')
  18. def __str__(self):
  19. return self.title
  20. class Student(models.Model):
  21. '''
  22. 道友表
  23. '''
  24. name = models.CharField(max_length=12,verbose_name='道友姓名')
  25. password = models.CharField(max_length=24,verbose_name='道友密码')
  26. classlist = models.ForeignKey(to=ClassList,verbose_name='道友所在班级')
  27. def __str__(self):
  28. return self.name
  29. class QuestionNaire(models.Model):
  30. '''
  31. 问卷表
  32. '''
  33. title = models.CharField(max_length=64,verbose_name='问卷标题')
  34. classlist = models.ForeignKey(to=ClassList,verbose_name='答问卷的班级')
  35. creator = models.ForeignKey(to=UserInfo,verbose_name='创建问卷的辣个银')
  36. def __str__(self):
  37. return self.title
  38.  
  39. class Question(models.Model):
  40. '''
  41. 问题表
  42. '''
  43. caption = models.CharField(max_length=64,verbose_name='问题')
  44. question_type = (
  45. (1,'打分'),
  46. (2,'单选'),
  47. (3,'评价'),
  48. )
  49. tp = models.IntegerField(choices=question_type)
  50. questionnaire = models.ForeignKey(to=QuestionNaire,verbose_name='该问卷下的问题',default=1)
  51. def __str__(self):
  52. return self.caption
  53.  
  54. class Option(models.Model):
  55. '''
  56. 单选题的选项
  57. '''
  58. option_name = models.CharField(max_length=32,verbose_name='选项名称')
  59. score = models.IntegerField(verbose_name='选项对应的分值')
  60. question = models.ForeignKey(to=Question,verbose_name='所在的问题')
  61. def __str__(self):
  62. return self.option_name
  63.  
  64. class Answer(models.Model):
  65. '''
  66. Answer my questions
  67. '''
  68. val = models.IntegerField(verbose_name='打分项的得分',null=True,blank=True)
  69. content = models.CharField(max_length=255,null=True,blank=True,verbose_name='评价')
  70. student = models.ForeignKey(to=Student,verbose_name='哪位道友答的题')
  71. question = models.ForeignKey(to=Question,verbose_name='答的是哪道题')
  72. option = models.ForeignKey(to=Option,verbose_name='单选选项',null=True)
  73. def __str__(self):
  74. return self.val

form相关:

  这里我们用到form & modelform来操作页面验证。

  需要注意的是: 这里添加问卷时,需要实时显示我们添加的东西哦。

  看代码:

  1. from django.forms import Form #代表类的基类
  2. from django.forms import fields #代表字段
  3. from django.forms import widgets #插件
  4. from django.forms import ModelForm #代表数据库和form可以一起用
  5. from app01 import models
  6.  
  7. class QuestionNaire_Form(Form):
  8. '''添加页面的Form验证'''
  9. title = fields.CharField(required=True,max_length=64,
  10. error_messages={
  11. 'required' : '问卷标题不可以为空!',
  12. 'max_length' : '超过最大长度'
  13. },
  14. widget=widgets.Textarea(attrs={'placeholder':'请输入问卷标题','type':'text','style':'width:80%;height:100px;','class':'form-control qn_title'}))
  15.  
  16. classlist = fields.ChoiceField(required=True,initial=1,
  17. error_messages={'required':'请选择班级'},widget=widgets.Select)
  18.  
  19. # fields.RegexField()
  20. # 实时更新问卷列表
  21. def __init__(self,*args,**kwargs):
  22. super(QuestionNaire_Form, self).__init__(*args,**kwargs)
  23. self.fields['classlist'].choices = models.ClassList.objects.values_list("id","title")
  24.  
  25. class QuestionModelForm(ModelForm):
  26. class Meta:
  27. model = models.Question
  28. fields = ['caption','tp'] #这两行代表 拿到当前表所有的字段
  29. #这个fields 是按照models里面写的字段格式在前端页面生成相应的东西.
  30. widgets={'caption':widgets.Textarea(attrs={'style':'width:600px;height:80px','class':'form-control','placeholder':'请输入问题名称'})}
  31. class OptionModelForm(ModelForm):
  32. class Meta:
  33. model = models.Option
  34. fields = ['option_name','score']

然后进入到我们的views页面:

  1. """
  2. 思路分析:
  3. 拿到前端的数据,像下面这种格式的
  4. 如果是json格式发的,注意要在request.body中取值。
  5. ajax_post_list = [
  6. {
  7. 'id': 2,
  8. 'caption': "你到底爱不爱我??",
  9. 'tp': 1,
  10.  
  11. },
  12. {
  13. 'id': None,
  14. 'caption': "你爱我什么?",
  15. 'tp': 3
  16. },
  17. {
  18. 'id': None,
  19. 'caption': "what do u say daring",
  20. 'tp': 2,
  21. "options": [
  22. {'id': 1, 'name': '绿', 'score': 10},
  23. {'id': 2, 'name': '翠绿', 'score': 8},
  24. ]
  25. },
  26. ]
  27. 前端的数据和数据库的数据进行比较,
  28. - 前端有后端没有要添加
  29. - 前端没有后端有要删除
  30. - 前端有后端也有要更新
  31. """
  32.  
  33. def eva_stu(request,class_id,qn_id):
  34.  
  35. stu_obj = models.Student.objects.filter(id=request.session.get("stu_info").get("stu_id"),classlist_id=class_id).first()
  36.  
  37. # 1. 先看是否是本班学生
  38. if not stu_obj:
  39. return HttpResponse('您不配啊!!!')
  40. # 2. 看它是否已经答过问卷
  41. ans_obj = models.Answer.objects.filter(student_id=stu_obj.id,question__questionnaire_id=qn_id).count()
  42. if ans_obj:
  43. return HttpResponse('别闹! 您已经答过了啊')
  44. # 3. 拿到所有的问题并显示
  45. from django.forms import Form,fields,widgets
  46. que_list = models.Question.objects.filter(questionnaire_id=qn_id).all()
  47. field_dict = {}
  48. for que in que_list:
  49. if que.tp == 1: # 打分用chioce
  50. field_dict['val_%s' % que.id] = fields.ChoiceField(
  51. label = que.caption,
  52. required=True,
  53. error_messages={'required' : '不能为空哦'},
  54. widget=widgets.RadioSelect,
  55. choices=[ (i,i) for i in range(1,11) if i ]
  56. )
  57. elif que.tp == 2 : # 单选
  58. field_dict['option_%s' % que.id] = fields.ChoiceField(
  59. required=True,
  60. label = que.caption,
  61. error_messages={'required':'必选'},
  62. choices = models.Option.objects.filter(question_id=que.id).values_list('id','option_name'), #为什么改成values_list就可以显示选项
  63. widget = widgets.RadioSelect
  64. )
  65. else :
  66. field_dict['text_%s' % que.id] = fields.CharField(
  67. required=True,
  68. label = que.caption,
  69. widget = widgets.Textarea,
  70. validators=[func,]
  71. )
  72. # print("field_dict",field_dict)
  73. # 创建类,并实例化
  74. # print('field_dict======',field_dict)
  75. MyAnswerForm = type('MyAnswerForm', (Form,),field_dict)
  76. if request.method == 'GET':
  77. form = MyAnswerForm()
  78. return render(request,'eva_stu.html',{'form':form})
  79. else:
  80. form = MyAnswerForm(request.POST)
  81. if form.is_valid():
  82. print(form.cleaned_data)
  83. # {'option_1': '2', 'option_2': '4', 'val_3': '4', 'text_4': '123123123213213213213'}
  84. l = []
  85. for key,v in form.cleaned_data.items():
  86. k,qid = key.rsplit('_',1)
  87. answer_dict = {'student_id':stu_obj.id,'question_id':qid,k:v}
  88. print(answer_dict)
  89. # l1 = l.append(answer_dict)
  90. l.append(models.Answer(**answer_dict))
  91. print(77777)
  92. # models.Answer.objects.bulk_create()
  93. return HttpResponse('ok')
  94. return render(request,'eva_stu.html',{'form':form})
  95.  
  96. # 自定义form验证
  97. from django.core.exceptions import ValidationError
  98. def func(val):
  99. if len(val) < 15 :
  100. raise ValidationError(' duan duan duan ')

显示问卷内容并且拿到提交后的问卷答案

end...

Django_调查问卷的更多相关文章

  1. "琳琅满屋"调查问卷 心得体会及结果分析

    ·关于心得体会       当时小组提出这个校园二手交易市场的时候,就确定了对象范围,仅仅是面向在校大学生,而且在我们之前就已经有了很多成功的商品交易的例子可以让我们去借鉴,再加上我们或多或少的有过网 ...

  2. JavasScript实现调查问卷插件

    原文:JavasScript实现调查问卷插件 鄙人屌丝程序猿一枚,闲来无事,想尝试攻城师是感觉,于是乎搞了点小玩意.用js实现调查问卷,实现了常规的题型,单选,多选,排序,填空,矩阵等. 遂开源贴出来 ...

  3. 关于“Durian”调查问卷的心得体会

    这周我们做了项目着手前的客户需求调查,主要以调查问卷的方式进行.其实做问卷调查并不是想象中的那么简单,首先要确定问卷调查的内容,每一个问题都要经过深思熟虑,字字斟酌,既要切合问卷主要目的,又要简洁扼要 ...

  4. 从Adobe调查问卷看原型设计工具大战

    近年国内外原型设计工具新品频出,除了拥趸众多的老牌Axure在RP 8之后没有什么大的动作,大家都拼了命地在出新品.今天 inVision 的 Craft 出了 2.0 的预告视频,明天 Adobe ...

  5. Scrum立会报告+燃尽图(十一月十七日总第二十五次):设计调查问卷;修复上一阶段bug

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2284 项目地址:https://git.coding.net/zhang ...

  6. <问吧>调查问卷心得体会

    <问吧>调查问卷心得与体会 在这之前,我们已经组成了一个六个人的小团队---“走廊奔跑队”,我们这次做的这个项目的名称是:问吧.在项目实施之前,我们必做的一步就是需求分析,目的就是充分了解 ...

  7. android 实现调查问卷-单选-多选

    非常久没写东西了.今天来总结下有关android调查问卷的需求实现. 转载请加地址:http://blog.csdn.net/jing110fei/article/details/46618229 先 ...

  8. 自动化测试调查问卷送《QTP自动化测试最佳实践》

    自动化测试调查问卷送<QTP自动化测试最佳实践> http://automationqa.com/forum.php?mod=viewthread&tid=2308&fro ...

  9. HDU - 6344 2018百度之星资格赛 1001调查问卷(状压dp)

    调查问卷  Accepts: 1289  Submissions: 5642  Time Limit: 6500/6000 MS (Java/Others)  Memory Limit: 262144 ...

随机推荐

  1. 数据结构与算法(C/C++版)【栈与队列】

    第三章<栈与队列> (一)栈简介  栈(Stack):只允许在一端进行插入或删除操作的线性表.首先栈是一种线性表,但是限定这种线性表只能在某一端进行插入和删除操作栈顶(top):线性表允许 ...

  2. Python3实现简单可学习的手写体识别

    0.目录 1.前言 2.通过pymssql与数据库的交互 3.通过pyqt与界面的交互 4.UI与数据库的交互 5.最后的main主函数 1.前言 版本:Python3.6.1 + PyQt5 + S ...

  3. 深入理解java虚拟机----->垃圾收集器与内存分配策略(下)

    1.  前言 内存分配与回收策略 JVM堆的结构分析(新生代.老年代.永久代) 对象优先在Eden分配 大对象直接进入老年代 长期存活的对象将进入老年代 动态对象年龄判定 空间分配担保  2.  垃圾 ...

  4. onunload事件和onbeforeunload事件

    记录知识点背景:在做一个h5项目时,在统计事件时有这样一个需求, 希望能统计到用户是从第几页离开的,用到了这个知识点.在此记录. window.onunload 1.定义和用法 onunload事件在 ...

  5. 从 Bridge 到 OVS,探索虚拟交换机

    Linux Bridge 和物理网络一样,虚拟网络要通信,必须借助一些交换设备来转发数据.因此,对于网络虚拟化来说,交换设备的虚拟化是很关键的一环. 上文「网络虚拟化」已经大致介绍了 Linux 内核 ...

  6. poj 2570 Fiber Network(floyd)

    #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int ...

  7. Android TCP/IP 扫盲教程

    TCP/IP 是因特网的通信协议. 通信协议是对计算机必须遵守的规则的描写叙述.仅仅有遵守这些规则.计算机之间才干进行通信. 浏览器和server都在使用 TCP/IP 因特网浏览器和因特网serve ...

  8. .Net 5分钟搞定网页实时监控

    一.为什么会用到网页实时监控 LZ最近在无锡买房了,虽然在上海工作,但是上海房价实在太高无法承受,所以选择还可以接受的无锡作为安身之地.买过房的小伙伴可能知道买房的流程,买房中间有一步很重要的就是需要 ...

  9. String类为什么要用final修饰(面试回答)

    String是所有语言中最常用的一个类.我们知道在Java中,String是不可变的.final的.Java在运行时也保存了一个字符串池(String pool),这使得String成为了一个特别的类 ...

  10. org.elasticsearch.transport.ReceiveTimeoutTransportException[cluster:monitor/nodes/liveness] request_id [31] timed out after [5000ms]

    ES连接超时,异常信息 2017-09-07 10:42:45.042 [elasticsearch[Bantam][transport_client_worker][T#17]{New I/O wo ...