【发布时间】: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) 添加分数(可能在我的函数 results 中 views.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