Как сохранить ответы от зарегистрированных пользователей и обработать / отфильтровать их в Django

#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)
  

Я согласен с любыми подсказками / предложениями или указаниями, поскольку это стало моим последним средством опубликовать это здесь, поскольку автор блога больше не активен. Я пытался манипулировать несколькими кодами здесь и там безрезультатно, я в основном прошу каких-либо подсказок, где посмотреть.

Резюмируя, как мне соединить две модели с полем, которое не является первичным ключом, чтобы отобразить его в другом представлении.

Ссылка на репозиторий Git

Комментарии:

1. Почему мне никто не помогает? : (