问卷调查

数据库设计

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

 

posted @ 2018-01-30 20:01  H......T!  阅读(642)  评论(0编辑  收藏  举报