Как сохранить ответы от зарегистрированных пользователей и обработать / отфильтровать их в Django - PullRequest
1 голос
/ 05 апреля 2019

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 хранилище

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...