#python #django #orm #django-forms
#python #django #orm #django-формы
Вопрос:
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)
Я согласен с любыми подсказками / предложениями или указаниями, поскольку это стало моим последним средством опубликовать это здесь, поскольку автор блога больше не активен. Я пытался манипулировать несколькими кодами здесь и там безрезультатно, я в основном прошу каких-либо подсказок, где посмотреть.
Резюмируя, как мне соединить две модели с полем, которое не является первичным ключом, чтобы отобразить его в другом представлении.
Комментарии:
1. Почему мне никто не помогает? : (