TLDR; Django新手,在this博客之后,我试图创建一个Django应用,学生可以在其中使用普通文本而不是多项选择题来回答问题。
当前,该项目允许教师创建“测验”,其中所有者是创建该测验的老师,为测验命名,并选择测验的主题(例如,数学,历史)。测验是多项选择题,有一些正确答案。每个正确的答案都会得到100分,然后由老师定义哪些响应是正确的。
class Quiz(models.Model):
owner = models.ForeignKey(User, on_delete=models.CASCADE, related_name='quizzes')
name = models.CharField(max_length=255)
subject = models.ForeignKey(Subject, on_delete=models.CASCADE, related_name='quizzes')
def __str__(self):
return self.name
每个学生都有一定的兴趣爱好,根据这些兴趣爱好,他的供稿中会出现测验。
class Student(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
quizzes = models.ManyToManyField(Quiz, through='TakenQuiz')
interests = models.ManyToManyField(Subject, related_name='interested_students')
def get_unanswered_questions(self, quiz):
answered_questions = self.quiz_answers \
.filter(answer__question__quiz=quiz) \
.values_list('answer__question__pk', flat=True)
questions = quiz.questions.exclude(pk__in=answered_questions).order_by('text')
return questions
def __str__(self):
return self.user.username
每次学生回答测验时,答案都会保存在一个名为StudentAnswer的模型中。
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)
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='+')
现在的问题是,此模型将学生的响应保存为ModelChoiceField形式,我想将其转换为普通文本输入形式。而且,如果我仅转换模型类型,则会给我一个错误,那就是答案必须是StudentAnswer实例。
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')
*我只需要知道如何转换此应用程序以接受普通文本输入,然后将其保存以显示给老师即可。然后,教师可以自己对它进行正确/错误评分。我能够在StudentAnswer模型中添加另一个字段,称为注释,以便教师可以查看它,并且该字段也保存在数据库中。但是,正如您所看到的,多对多关系仅存在于测验模型,问题模型和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='+')
comments = models.CharField(max_length=255,default=0)
我对任何暗示/建议或指示都很好,因为博客作者不再活跃,这已成为我在这里发表的最后手段。我试图在这里和那里操纵一些代码是徒劳的,我基本上是在寻找任何提示去哪里找。
总结,如何连接两个模型(其字段不是主键)以便在另一个视图上显示。