TLDR;Новичок Django здесь, после этого блога, я попытался создать приложение 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)
Я в порядке с любыми подсказками / предложениями или указаниями, так как это стало моим последним средством опубликовать его здесь, так какАвтор блога больше не активен.Я попытался манипулировать несколькими кодами здесь и там безрезультатно, я в основном спрашиваю какие-либо подсказки для того, где искать.
Суммировано, Как связать две модели с полем, не являющимся первичным ключом, чтобы отобразить его в другом виде.
СсылкаGit хранилище