【问题标题】:Django questionnaire with several score categories per answerDjango 问卷,每个答案有几个分数类别
【发布时间】:2020-01-14 11:14:26
【问题描述】:

我对 Django 非常陌生(而且对 HTML 肯定很生疏),基本上看过几次官方教程。我计划创建一个带有问题列表的简单问卷,这些问题可以有多个答案,每个答案都有不同类别的特定分数。最后添加每个类别的分数,并根据分数显示一条消息。

然而,我对如何在模板中显示每个问题的答案有点困惑。 我也不确定如何计算最终分数:我应该在我的模型中创建一个新类以存储分数?或者我应该只在views.py中执行(我现在更喜欢这个解决方案,我不需要将分数存储在数据库中,也不需要登录用户)?

这是我目前所拥有的:

models.py

from django.db import models
from django.contrib.auth.models import User

class Questionnaire(models.Model):
    questionnaire_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

    def __str__(self):
        return self.questionnaire_text

class Question(models.Model):
    questionnaire = models.ForeignKey(Questionnaire, on_delete = models.CASCADE)
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

    def __str__(self):
        return self.question_text

class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete = models.CASCADE)
    choice_text = models.CharField(max_length=200)
    C1 = models.IntegerField(default=0)
    C2 = models.IntegerField(default=0)
    N1 = models.IntegerField(default=0)
    N2 = models.IntegerField(default=0)
    N3 = models.IntegerField(default=0)
    N4 = models.IntegerField(default=0)

    def __str__(self):
        return self.choice_text

class QuestionnaireInstance(models.Model):
    taker = models.ForeignKey(User, on_delete = models.CASCADE)
    questionnaire_taken = models.ForeignKey(Questionnaire, on_delete = models.CASCADE)
    C1_score = models.IntegerField(default=0)
    C2_score = models.IntegerField(default=0)
    N1_score = models.IntegerField(default=0)
    N2_score = models.IntegerField(default=0)
    N3_score = models.IntegerField(default=0)
    N4_score = models.IntegerField(default=0)

    def __str__(self):
        return str(self.taker)

views.py

from django.shortcuts import render
from django.http import HttpResponse
from django.template import loader

from .models import Question, Questionnaire, Choice

def index(request):
    latest_questionnaire_list = Questionnaire.objects.order_by('-pub_date')[:5]
    template = loader.get_template('test/index.html')
    context = {
        'latest_questionnaire_list': latest_questionnaire_list
    }
    return HttpResponse(template.render(context,request))

def detail (request):
    latest_question_list = Question.objects.all()
    template = loader.get_template('test/detail.html')
    context = {
        'latest_question_list': latest_question_list
    }
    return HttpResponse(template.render(context, request))

def results (request):
    questionnaire_instance = QuestionnaireInstance.objects.get(taker=request.user)
    answer_instance = Choice.objects.all()

    if request.method == 'POST':
       questionnaire_instance.C1_score=+ answer_instance.values_list('C1',flat=True)[selected answer] #No clue how to call on the score of the specifically selected answer here

urls.py

from django.urls import path
from . import views

app_name = 'test'
urlpatterns = [
    path('', views.index, name='index'),
    path('detail/', views.detail, name='detail'),
    path('results/', views.results, name='results'),
]

detail.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Test</title>
</head>
<body>
{% if latest_question_list %}
{% for item in latest_question_list %}
<h1>{{ item.question_text}}</h1>
    {% for answer in item.choice_set.all %}
    <form action="{% url 'oritest:results'%}" method="post">
    <p>
    {% csrf_token %}
        <input type="checkbox" name="answer" id="answer"
        value="{{ answer.id }}">
    <label for="answer">{{ answer.choice_text }}
    </label><br>
    </p>
    {% endfor %}
{% endfor %}


<input type="submit" value="Confirm">
<input type="button" onclick="history.back();" value="Back">

</form>
{% else %}
    <p>No polls are available.</p>
{% endif %}
</body>
</html>

我想:

1) 让detail.html 使用单选按钮显示每个问题及其答案。

2) 添加分数(可能在我的函数 resultsviews.py 并显示在 results.html 中)并根据该分数做一些事情。

编辑:我自己解决了第一个问题(参见detail.html 的代码)。稍后我可能会尝试使用酥脆的形状以使其更好,但到目前为止它看起来就像我想要的那样。不过,我仍然需要弄清楚评分系统。

我已将QuestionnaireInstance 类添加到models.py 以存储Choice 的分数。我想我必须:

1) 在我的视图中实例化(例如)results 中的 C1_score 和 C1。

2) 在results 中也有类似C1_score =+ C1 的内容。

3) 根据 C1_score 在 results.html 中显示一些内容(例如用户分数和图片)。

我不确定根据用户实例化 C1_score 的语法。

Edit2:有什么我必须添加的信息才能获得帮助吗?

【问题讨论】:

    标签: python html django django-templates django-views


    【解决方案1】:

    对于表格本身,我强烈推荐脆皮表格。它们看起来不错,可以节省一些工作量。

    我建议您将正确答案存储在数据库中,以便更容易评分,并创建一个响应模型来存储提交的答案。然后在每个问题之后,您将通过 success_url 将响应 pk 传递到呈现结果模板的结果视图。

    【讨论】:

    • 谢谢。我已经设法让我的 detail.html 看起来像我想要的那样(参见上面的编辑)。我还在我的模型中创建了一个新的QuestionnaireInstance 类来存储我的Choice 类的每个值。我现在必须弄清楚如何通过提交表单将答案的值发送到数据库中的QuestionnaireInstance
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 2012-12-02
    • 1970-01-01
    相关资源
    最近更新 更多