• 问卷调查


    数据库设计

    from django.db import models
    
    class UserInfo(models.Model):
        """
        员工表
        """
        name = models.CharField(max_length=32)
    
        def __str__(self):
            return self.name
    
    class ClassList(models.Model):
        """
        班级表
        """
        title = models.CharField(max_length=32)
    
        def __str__(self):
            return self.title
    
    class Student(models.Model):
        """
        学生表
        """
        user = models.CharField(max_length=32)
        pwd = models.CharField(max_length=32)
        cls = models.ForeignKey(to=ClassList)
    
        def __str__(self):
            return self.user
    
    
    class Questionnaire(models.Model):
        """
        问卷表
        """
        title = models.CharField(max_length=64)
        cls = models.ForeignKey(to=ClassList)
        creator = models.ForeignKey(to=UserInfo)
    
        def __str__(self):
            return self.title
    
    class Question(models.Model):
        """
        问题
        """
        caption = models.CharField(max_length=64)
    
        question_types = (
            (1,'打分'),
            (2,'单选'),
            (3,'评价'),
        )
        tp = models.IntegerField(choices=question_types)
        questionnaire = models.ForeignKey("Questionnaire", verbose_name="关联问卷", default=None)
    
        def __str__(self):
            return self.caption
    
    class Option(models.Model):
        """
        单选题的选项
        """
        name = models.CharField(verbose_name='选项名称',max_length=32)
        score = models.IntegerField(verbose_name='选项对应的分值')
        qs = models.ForeignKey(to=Question)
    
        def __str__(self):
            return self.name
    
    class Answer(models.Model):
        """
        回答
        """
        stu = models.ForeignKey(to=Student)
        question = models.ForeignKey(to=Question)
    
        option = models.ForeignKey(to="Option",null=True,blank=True)
        val = models.IntegerField(null=True,blank=True)
        content = models.CharField(max_length=255,null=True,blank=True)
        def __str__(self):
            return self.stu
    
    models.py
    model.py

    增加问题:

    1. 问题: 此时问卷表新增加的问题是一个form对象 而问卷表中有问题的是多个form对象 前端需要做区分判断 不方便

    问卷表
     
        - 后端
     
            - 获取当前问卷表中的所有问题
            - 判断是否可以获取到
                - 是
                    - 代表问卷调查表中含有问题  有几个对象代表这个问卷表中含有几个问题
                    - 每个问题对象生成一个form对象, 如果有默认值需要传入参数instance=对象
                - 否
                    - 新创建一个没有默认值的form对象
    
    class QuestionModelForm(ModelForm):
    
        class Meta:
            model = models.Question
            fields = ["caption","question_types"]
    
    
    
    
    def question(request,pid):
    
        que_list = models.Question.objects.filter(questionnaire_id=pid)
        if not que_list:
            form = QuestionModelForm()
        else:
            for item in que_list:
                form = QuestionModelForm(instance=item)
    View Code

    2. 前后端初步实现显示问题列表

    问卷表
     
        - 后端
     
            - 获取当前问卷表中的所有问题
            - 判断是否可以获取到
                - 是
                    - 代表问卷调查表中含有问题  有几个对象代表这个问卷表中含有几个问题
                    - 每个问题对象生成一个form对象, 如果有默认值需要传入参数instance=对象
                    - 定义一个[] 循环的form对象都追加到[]中
                - 否
                    - 新创建一个没有默认值的form对象
                    - 定义一个[] 新创建的form对象传入
     
        - 前端
     
            - 使用ol li 这样前端显示的问题一或其它问题删除 ,其它问题就可以顶上来
    
    from django.shortcuts import render
    from app01 import models
    from django.forms import Form,ModelForm
    
    
    def index(request):
    
        question_list = models.Questionnaire.objects.all()
    
        return render(request,"index.html",locals())
    
    
    class QuestionModelForm(ModelForm):
    
    
        class Meta:
            model = models.Question
            fields = ["caption","tp"]
    
    
    
    
    def question(request,pid):
    
        que_list = models.Question.objects.filter(questionnaire_id=pid)
        form_list = []
        if not que_list:
            form = QuestionModelForm()
            form_list.append(form)
        else:
            for item in que_list:
                form = QuestionModelForm(instance=item)
                form_list.append(form)
        return render(request,"que.html",{"form_list":form_list})
    
    Views.py
    Views.py
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <ol>
            {% for item in form_list %}
                <li>
                    <div pk="{{ item.obj.id }}">
                        <p>{{ item.form.caption }}</p>
                        <p>{{ item.form.tp }}</p>
                    </div>
                </li>
            {% endfor %}
        </ol>
    </body>
    </html>
    
    que.html
    que.html

    4. 当类型为单选 显示增加选项 否则隐藏

    问卷表
     
        - 后端
     
            - 获取当前问卷表中的所有问题
            - 定义一个函数 使用yield {}传给前端
                - 判断是否可以获取到问题对象
                    - 是
                        - 代表问卷调查表中含有问题  有几个对象代表这个问卷表中含有几个问题
                        - 每个问题对象生成一个form对象, 如果有默认值需要传入参数instance=对象
                        - 定义{"form":form,"obj":item,"option_class":"hide","option"}
                        - 如果循环的对象的类型为单选
                            - 字典增加设置一个值为空 作用:前端增加选项的隐藏属性设置为空 
     
                        - yield 返回字典对象
                    - 否
                        - 新创建一个没有默认值的form对象
                        - yield 返回{"form":form,"obj":item,"option_class":"hide"}
     
        - 前端
     
            - 使用ol li 这样前端显示的问题一或其它问题 删除 ,其它问题就可以顶上来
            - 循环取出问题对象的问题和类型 和问题的id
                - 为每个问题对象的div自定义属性 pk=id 为以后和后端 做删除或修改操作
                - 为每个类型后面添加 增加选项
    
    from django.shortcuts import render
    from app01 import models
    from django.forms import Form,ModelForm
    
    
    def index(request):
    
        question_list = models.Questionnaire.objects.all()
    
        return render(request,"index.html",locals())
    
    
    class QuestionModelForm(ModelForm):
    
    
        class Meta:
            model = models.Question
            fields = ["caption","tp"]
    
    
    
    
    def question(request,pid):
    
        def inner():
            que_list = models.Question.objects.filter(questionnaire_id=pid)
    
            if not que_list:
                form = QuestionModelForm()
                yield {"form":form,"obj":None,"option_class":"hide"}
            else:
                for item in que_list:
                    form = QuestionModelForm(instance=item)
                    temp = {"form":form,"obj":item,"option_class":"hide"}
                    if item.tp == 2:
                        temp["option_class"] = ''
                    yield temp
    
    
    
        return render(request,"que.html",{"form_list":inner()})
    
    views.py
    views.py
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            .hide{
                display: none;
            }
        </style>
    </head>
    <body>
        <ol>
            {% for item in form_list %}
                <li>
                    <div pk="{{ item.obj.id }}">
                        <p>{{ item.form.caption }}</p>
                        <p>{{ item.form.tp }} <a href="#" class="{{ item.option_class }}">增加选项</a></p>
                    </div>
                </li>
            {% endfor %}
        </ol>
    </body>
    </html>
    
    que.html
    que.html

    5. 打分显示

    问卷表
     
        - 后端
     
            - 获取当前问卷表中的所有问题
            - 定义一个函数 使用yield {}传给前端
                - 判断是否可以获取到问题对象
                    - 是
                        - 代表问卷调查表中含有问题  有几个对象代表这个问卷表中含有几个问题
                        - 每个问题对象生成一个form对象, 如果有默认值需要传入参数instance=对象
                        - 定义{"form":form,"obj":item,"option_class":"hide","option":None}
                        - 如果循环的对象的类型为单选
                            - 字典增加设置一个值为空 作用:前端增加选项的隐藏属性设置为空 
                            - 找到这个问题单选的所有选项 把每一选项的对象加入一个列表 字典的option重新赋值列表
     
                        - yield 返回字典对象
                    - 否
                        - 新创建一个没有默认值的form对象
                        - yield 返回{"form":form,"obj":item,"option_class":"hide","option":None}
     
        - 前端
     
            - 使用ol li 这样前端显示的问题一或其它问题 删除 ,其它问题就可以顶上来
            - 循环取出问题对象的问题和类型 和问题的id
                - 为每个问题对象的div自定义属性 pk=id 为以后和后端 做删除或修改操作
                - 为每个类型后面添加 增加选项
                - 循环打分 
    
    from django.shortcuts import render
    from app01 import models
    from django.forms import Form,ModelForm
    
    
    def index(request):
    
        question_list = models.Questionnaire.objects.all()
    
        return render(request,"index.html",locals())
    
    
    class QuestionModelForm(ModelForm):
    
    
        class Meta:
            model = models.Question
            fields = ["caption","tp"]
    
    class OptionModelForm(ModelForm):
    
        class Meta:
            model = models.Option
            fields = ["name","score"]
    
    
    
    def question(request,pid):
    
        def inner():
            que_list = models.Question.objects.filter(questionnaire_id=pid)
    
            if not que_list:
                form = QuestionModelForm()
                yield {"form":form,"obj":None,"option_class":"hide","option":None}
            else:
                for item in que_list:
                    form = QuestionModelForm(instance=item)
                    temp = {"form":form,"obj":item,"option_class":"hide","option":None}
                    if item.tp == 2:
                        temp["option_class"] = ''
                        option_model_list = []
                        option_list = models.Option.objects.filter(qs=item)
                        for v in option_list:
                            obj = OptionModelForm(instance=v)
                            option_model_list.append(obj)
                        temp["option"] = option_model_list
                    yield temp
    
    
    
        return render(request,"que.html",{"form_list":inner()})
    
    views.py
    views.py
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            .hide{
                display: none;
            }
        </style>
    </head>
    <body>
        <ol>
            {% for item in form_list %}
                <li>
                    <div pk="{{ item.obj.id }}">
                        <p>{{ item.form.caption }}</p>
                        <p>{{ item.form.tp }} <a href="#" class="{{ item.option_class }}">增加选项</a></p>
                        <ul>
                            {% for v in item.option %}
                            <div>
                                <li>
                                    <p>{{ v.name }} {{ v.score }}</p>
                                </li>
    
                            </div>
                            {% endfor %}
                        </ul>
                    </div>
                </li>
    
            {% endfor %}
        </ol>
    </body>
    </html>
    
    que.html
    que.html
    from django.shortcuts import render
    from app01 import models
    from django.forms import Form,ModelForm
    
    
    def index(request):
    
        question_list = models.Questionnaire.objects.all()
    
        return render(request,"index.html",locals())
    
    
    class QuestionModelForm(ModelForm):
    
    
        class Meta:
            model = models.Question
            fields = ["caption","tp"]
    
    class OptionModelForm(ModelForm):
    
        class Meta:
            model = models.Option
            fields = ["name","score"]
    
    
    
    def question(request,pid):
    
        def inner():
            que_list = models.Question.objects.filter(questionnaire_id=pid)
    
            if not que_list:
                form = QuestionModelForm()
                yield {"form":form,"obj":None,"option_class":"hide","option":None}
            else:
                for item in que_list:
                    form = QuestionModelForm(instance=item)
                    temp = {"form":form,"obj":item,"option_class":"hide","option":None}
                    if item.tp == 2:
                        temp["option_class"] = ''
                        def inner_loop(item):
                            option_list = models.Option.objects.filter(qs=item)
                            for v in option_list:
                                yield OptionModelForm(instance=v)
    
                        temp["option"] = inner_loop(item)
                    yield temp
    
    
    
        return render(request,"que.html",{"form_list":inner()})
    
    views.py 生成器
    views.py 生成器

    6. 打分显示id

    que.html
    from django.shortcuts import render
    from app01 import models
    from django.forms import Form,ModelForm
    
    
    def index(request):
    
        question_list = models.Questionnaire.objects.all()
    
        return render(request,"index.html",locals())
    
    
    class QuestionModelForm(ModelForm):
    
    
        class Meta:
            model = models.Question
            fields = ["caption","tp"]
    
    class OptionModelForm(ModelForm):
    
        class Meta:
            model = models.Option
            fields = ["name","score"]
    
    
    
    def question(request,pid):
    
        def inner():
            que_list = models.Question.objects.filter(questionnaire_id=pid)
    
            if not que_list:
                form = QuestionModelForm()
                yield {"form":form,"obj":None,"option_class":"hide","option":None}
            else:
                for item in que_list:
                    form = QuestionModelForm(instance=item)
                    temp = {"form":form,"obj":item,"option_class":"hide","option":None}
                    if item.tp == 2:
                        temp["option_class"] = ''
    
                        def inner_loop(item):
                            option_list = models.Option.objects.filter(qs=item)
                            for v in option_list:
                                yield {"form":OptionModelForm(instance=v),"obj":v}
    
                        temp["option"] = inner_loop(item)
                    yield temp
    
    
    
        return render(request,"que.html",{"form_list":inner()})
    
    Views.py
    Views.py
  • 相关阅读:
    生成操作 嵌入的资源
    用JavaScript操作CSS滤镜实现最近新闻旁边的“new”
    26个ASP.NET常用性能优化方法
    kafka集群搭建(windows环境下)
    AtCoder Beginner Contest 215 F Dist Max 2(二分、尺取)
    CodeForces 1487C Minimum Ties(建图、模拟)
    C#获取 URL参数
    编程给程序员带来哪些坏习惯
    【转载】IIS和服务器安全设置教程
    [转载]在IE8下动易SiteWeaver后台编辑器按钮没有反应的解决方案
  • 原文地址:https://www.cnblogs.com/w-s-l123/p/8387024.html
Copyright © 2020-2023  润新知