Как преобразовать поле типа ввода Много-ко-многим подключенной модели? - PullRequest
0 голосов
/ 06 апреля 2019

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

Это модель теста:

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)

, где поле «Вопрос» связанок модели «Ответ». Как видите, здесь не упоминается, какова форма ответа, или, может быть, я не в состоянии понять.

Вот модель «Студента»:

class Student(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
    quizzes = models.ManyToManyField(Quiz, through='TakenQuiz')

Затем есть модель TakenQuiz, которая является моделью, в которой хранятся ответы каждого учащегося.

 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='+')

Подводя итог, модель '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')

И она сохраняется как ответы с несколькими вариантами ответов, так как в каждом тесте есть вопросы, и у каждого вопроса есть несколько вариантов выбора.

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

Что я пробовал

Я попытался изменить форму для обычного ввода текста и даже добавил другое поле:

class TakeQuizForm(forms.ModelForm):
    answer = forms.CharField(required=True)
    comments= forms.CharField(required=True)

    class Meta:
        model = StudentAnswer
        fields = ('answer', 'comments', )

    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 »должен быть экземпляром« Ответ ».

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

Помогите мне, товарищ по кодированию, вы моя единственная надежда.

Справочные материалы


Блог, где я учусь Django

Github Link

Онлайн-демонстрация проекта (Оригинал, который я хочу поменять)

...