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. ZTREE改版 -- 增删减 -- 图标字体化 完整改版

    引言 这次主要更新增删改功能以及修复存在的一些bug:图标能动态改变,回调函数添加 ZTREE改版功能完善 前面文章对于改版过程做了较详细的解释,这里就不多加赘述了,直接看效果图: 增加按钮: 修改节 ...

  2. Ansible - 简介和应用自动化基础实践

    installAnsible简介和应用自动化基础实践 一.引入: 1.1  如官方定义,Ansible is The simplest way to automate apps and IT infr ...

  3. Python爬虫学习之使用beautifulsoup爬取招聘网站信息

    菜鸟一只,也是在尝试并学习和摸索爬虫相关知识. 1.首先分析要爬取页面结构.可以看到一列搜索的结果,现在需要得到每一个链接,然后才能爬取对应页面. 关键代码思路如下: html = getHtml(& ...

  4. 多版本VisualStudio导致的.net版本问题

      写在前面:本博文是在我现有知识状态下写的, 我现在是小白, 有错误欢迎指正. 以后假如接触到更合理的见解, 我一定会修正这篇博文的. 本文原是在我本地笔记中待着的, 写于2016/05/17. 下 ...

  5. 一起talk C栗子吧(第一百二十六回:C语言实例--statickeyword)

    各位看官们,大家好,上一回中咱们说的内置宏的样例.这一回咱们说的样例是:static关键字. 闲话休提.言归正转. 让我们一起talk C栗子吧! 看官们,C语言提供了static关键字.它常常出如今 ...

  6. C++11新特性应用--介绍几个新增的便利算法(不更改容器中元素顺序的算法)

    总所周知.C++ STL中有个头文件,名为algorithm.即算法的意思. The header<algorithm>defines a collection of functions ...

  7. 关于Oracle处理DDL和DML语句的事务管理

    SQL主要程序设计语言 数据定义语言DDL(Data Definition Language) 如 create.alter.drop, 数据操作语言DML(Data Munipulation Lan ...

  8. 刚在在win8.1下装了ubuntu12.04

    这是一个開始. 開始我想在win7下,由于我本来是7和win8.1双系统,想直接把win7覆盖了. 可是不知道怎么回事,比較复杂.于是在win8.1下装了. 先把win7的系统盘格式化了. 把下的is ...

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

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

  10. thinkphp5URL和路由

    前面的话 本文将详细介绍thinkphp5URL和路由 URL访问 ThinkPHP采用单一入口模式访问应用,对应用的所有请求都定向到应用的入口文件,系统会从URL参数中解析当前请求的模块.控制器和操 ...