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_调查问卷的更多相关文章

  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. php IP转换整形(ip2long)

    如何将四个字段以点分开的IP网络址协议地址转换成整数呢?PHP里有这么一个函数ip2long.比如 <?php echo ip2long("10.2.1.3"); ?> ...

  2. 【Java入门提高篇】Day6 Java内部类——成员内部类

    内部类是什么,简单来说,就是定义在类内部的类(一本正经的说着废话). 一个正经的内部类是长这样的: public class Outer { class Inner{ } } 这是为了演示而写的类,没 ...

  3. 小白的Python之路 day1 用户输入

    1 2 3 4 5 6 7 8 #!/usr/bin/env python #_*_coding:utf-8_*_   username =input("username:") p ...

  4. netty使用从0到1

    本周强总在组内做了netty分享,内容相当不错,趁着这次分享记录的,以及以前研究,进行一下记录. java io形式存在三种,一种是BIO传统IO是阻塞IO,面向字符.字节服务都属于这一种.NIO官方 ...

  5. 【译】使用Jwt身份认证保护 Asp.Net Core Web Api

    原文出自Rui Figueiredo的博客,原文链接<Secure a Web Api in ASP.NET Core> 摘要:这边文章阐述了如何使用 Json Web Token (Jw ...

  6. Effective Java 第三版——1. 考虑使用静态工厂方法替代构造方法

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  7. Java IO(3)非阻塞式输入输出(NIO)

    在上篇<Java IO(2)阻塞式输入输出(BIO)>的末尾谈到了什么是阻塞式输入输出,通过Socket编程对其有了大致了解.现在再重新回顾梳理一下,对于只有一个“客户端”和一个“服务器端 ...

  8. POJ-1250

    #include<iostream> #include<string> #include<list> #include<algorithm> using ...

  9. 学习vi和vim编辑器(5):越过基础的藩篱

    本章将对之前学习的编辑命令如" c "." d "." y "等命令进行总结,并学习一些新的知识:其它进入vi的方法,利用缓冲区来存储拖曳或 ...

  10. 时光轴三之 ExpandableListView版时光轴效果

    上两篇讲到了用listView和recyclerView来实现时光轴,这一篇我们用ExpandableListView来实现时光轴,废话不多说,直接来代码. 还是先activity_main.xml ...