Я сделаю все возможное, чтобы объяснить мою проблему.Я работаю над онлайн-приложением для викторины, созданным в Джанго, в котором студенты могут отвечать на вопросы с помощью текстовых полей.К счастью, Я нашел блог, который делает именно это , но на этот вопрос можно ответить только с помощью полей с несколькими вариантами выбора, а не ввода текста.
Это модель теста:
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')
, которое изменило тест с:
к этому:
, но когда я сохраняю что-либо в поле ответа, это дает мне
Невозможно назначить "'asdf' ":« StudentAnswer.answer »должен быть экземпляром« Ответ ».
Я просто сохраняю любой вид ввода текста и позволяю учителю видеть этот текстовый блок.Не стесняйтесь задавать любые вопросы, так как я был озадачен этим около недели, так что все помогает.
Помогите мне, товарищ по кодированию, вы моя единственная надежда.
Справочные материалы
Онлайн-демонстрация проекта (Оригинал, который я хочу поменять)