如何保存已注册用户的响应并在Django中处理/过滤它们

时间:2019-04-05 19:37:19

标签: python django orm django-forms

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)

我对任何暗示/建议或指示都很好,因为博客作者不再活跃,这已成为我在这里发表的最后手段。我试图在这里和那里操纵一些代码是徒劳的,我基本上是在寻找任何提示去哪里找。

总结,如何连接两个模型(其字段不是主键)以便在另一个视图上显示。

Link to Git repository

0 个答案:

没有答案