如何转换多对多连接的模型输入类型字段?

时间:2019-04-06 09:40:41

标签: python django-models orm foreign-keys many-to-many

我将尽力解释我遇到的问题。我正在使用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')

将测验从以下位置更改:

enter image description here 对此:

quizafter

但是当我在答案字段中保存任何内容时,它会给我

  

无法分配“'asdf'”:“ StudentAnswer.answer”必须是“ Answer”实例。

我只是保存任何类型的文本输入,并让老师看到该文本块。随便问任何问题,因为我已经为这个问题困扰了大约一个星期,所以有什么帮助。

帮我编码员,你是我唯一的希望。

参考资料


Blog from where I am learning Django

Github Link

Online demo of project (The original, which I want to change)

0 个答案:

没有答案