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':'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 
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':'width: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...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM