我将尽力解释我遇到的问题。我正在使用Django创建的在线测验Web应用程序,学生可以在其中使用输入文本字段回答问题。幸运的是,I found a blog which does exactly that但是,测验只能由“选择多项”字段回答,而不能输入文本。
这是测验模型:
net.dv8tion:JDA:3.8.3_462
所有者是创建测验的老师,这是注册模型“用户”的外键。
问题模型如下:
class Quiz(models.Model):
owner = models.ForeignKey(User, on_delete=models.CASCADE, related_name='quizzes')
name = models.CharField(max_length=255)
这里的文本是一个独立的字段,测验与上面的“测验”模型有关。
然后,有一个答案模型:
class Question(models.Model):
quiz = models.ForeignKey(Quiz, on_delete=models.CASCADE, related_name='questions')
text = models.CharField('Question', max_length=255)
“问题”字段与“答案”模型相关的位置。 如您所见, 这里没有提到答案的形式,或者我听不懂。
这是“学生”模型:
class Answer(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE, related_name='answers')
text = models.CharField('Answer', max_length=255)
is_correct = models.BooleanField('Correct answer', default=False)
然后有一个TakenQuiz模型,该模型用于存储每个学生的回答。
class Student(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
quizzes = models.ManyToManyField(Quiz, through='TakenQuiz')
最后是StudentAnswer模型,其中存在两个相互关联的字段(用户和学生),而答案本身与“ Answer”模型相关,而“ Answer”与模型“ Question”相关“问题”与“测验”相关。如果您仍然在这里,我将很感激,但也许我可能已经提供了太多数据来解决这个谜题。
class TakenQuiz(models.Model):
student = models.ForeignKey(Student, on_delete=models.CASCADE, related_name='taken_quizzes')
quiz = models.ForeignKey(Quiz, on_delete=models.CASCADE, related_name='taken_quizzes')
score = models.FloatField()
date = models.DateTimeField(auto_now_add=True)
总结,“ StudentAnswer”模型的使用形式如下:
class StudentAnswer(models.Model):
student = models.ForeignKey(Student, on_delete=models.CASCADE, related_name='quiz_answers')
answer = models.ForeignKey(Answer, on_delete=models.CASCADE, related_name='+')
而且,由于每个测验都有问题,并且每个问题都有几个选择供您选择,因此它被存储为多条目选择答案。
但是,我想替换此字段,或添加另一个简单的文本字段,该文本字段存储在数据库中供教师查看。
我尝试将表单更改为普通文本输入,甚至添加了另一个字段:
class TakeQuizForm(forms.ModelForm):
answer = forms.ModelChoiceField(
queryset=Answer.objects.none(),
widget=forms.RadioSelect(),
required=True,
empty_label=None)
class Meta:
model = StudentAnswer
fields = ('answer', )
def __init__(self, *args, **kwargs):
question = kwargs.pop('question')
super().__init__(*args, **kwargs)
self.fields['answer'].queryset=question.answers.order_by('text')
将测验从以下位置更改:
但是当我在答案字段中保存任何内容时,它会给我
无法分配“'asdf'”:“ StudentAnswer.answer”必须是“ Answer”实例。
我只是保存任何类型的文本输入,并让老师看到该文本块。随便问任何问题,因为我已经为这个问题困扰了大约一个星期,所以有什么帮助。
帮我编码员,你是我唯一的希望。
Online demo of project (The original, which I want to change)