zoukankan      html  css  js  c++  java
  • Django_调查问卷

    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 
    12 # class P:
    13 #     pass
    14 # print('type(P)---',type(P))
    15 # print('P.__name__===',P.__name__)
    16 #
    17 # f = type('W',(object,),{})
    18 # print('type(f)---',type(f))
    19 # print('f.__name__===',f.__name__)
    20 
    21 
    22 
    23 # x = set('pwf')
    24 # y = set('pwf123')
    25 #
    26 # print(y - x)  # {'2', '3', '1'}
    27 # print(x - y)  # set()
    28 
    29 # l = []
    30 # d =  {'option_1': '2', 'option_2': '4', 'val_3': '4', 'text_4': '123123123213213213213'}
    31 # for k,v in d.items() :
    32 #     # print('k',k,'v',v)
    33 #     key,qid = k.rsplit('_',1)
    34 #     # print(key,qid)
    35 #     answer_dict = {'stu_id': id, 'que_id': qid, key: v}
    36 #     print(answer_dict)
    37 #     l.append(answer_dict)
    38 # 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来操作页面验证。

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

      看代码:

     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':'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 
    26 
    27 class QuestionModelForm(ModelForm):
    28     class Meta:
    29         model = models.Question
    30         fields = ['caption','tp']     #这两行代表  拿到当前表所有的字段
    31                                       #这个fields 是按照models里面写的字段格式在前端页面生成相应的东西.
    32         widgets={'caption':widgets.Textarea(attrs={'style':'600px;height:80px','class':'form-control','placeholder':'请输入问题名称'})}
    33 class OptionModelForm(ModelForm):
    34     class Meta:
    35         model = models.Option
    36         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 
     97 # 自定义form验证
     98 from django.core.exceptions import ValidationError
     99 def func(val):
    100     if len(val) < 15 :
    101         raise ValidationError(' duan duan duan ')
    显示问卷内容并且拿到提交后的问卷答案

    end...

  • 相关阅读:
    AsyncTask的用法
    关于 android setAnimationStyle 的问题
    android有关bluetooth常用api简介
    Android调用系统Activity选取图像部分区域
    Android 关于ListView几个特别的属性
    Android应用界面动画切换(主要Tabhost中跳转出来的动画效果解决[转]
    ✿Android 3.1 久违的 USB、mtp、rtp
    读《C++沉思录》心得:拷贝构造函数
    Cloud Foundy入门
    HDFS读文件详解
  • 原文地址:https://www.cnblogs.com/Wormhole-f/p/8215384.html
Copyright © 2011-2022 走看看