Django - приложение для викторины - проблема с формами, я полагаю
Я пытаюсь сделать приложение с помощью django, которое позволит мне учиться.
на данный момент я уже сделал это
models.py
class Question(models.Model):
question_text = models.CharField(max_length=200, null=True)
answer_text = models.CharField(max_length=200, null=True)
date_posted = models.DateTimeField(auto_now_add = True)
def __str__(self):
return self.question_text
class Test(models.Model):
name = models.CharField(max_length=200)
questions = models.ManyToManyField(Question)
author = models.ForeignKey(User, on_delete=models.CASCADE, default=None, null=True, blank=True)
date_posted = models.DateTimeField(auto_now_add = True)
urls.py
urlpatterns = [
path('', views.home, name='home'),
path('test/<str:pk>/', views.test),
]
views.py
def test(request, pk):
test = Test.objects.get(id=pk)
questions = test.questions.all()
form = Answer()
context = {'questions':questions, 'form':form}
if request.method == 'POST':
instance = Question.objects.get(id=pk)
form = Answer(request.POST, instance=instance)
if form.is_valid():
if request.POST.get("answer").strip() == instance.answer:
return redirect('home')
return render(request, 'exam/test.html', context)
forms.py
class Answer(ModelForm):
class Meta:
model = Question
fields = ['answer_text']
answer = forms.CharField(label='Your answer', max_length=100)
и мой html-код:
{% for question in questions %}
<div class="question-container">
<p>{{question.question_text}}</p>
<form method="POST">
<td>{{ form.answer }}</td>
{% csrf_token %}
<input type="hidden" name="question_id" value="{{ question.id }}" />
<td>
<input type="submit" value="submit">
</td>
</form>
</div>
{% endfor %}
Я не реализовал никакой функции счетчика очков. Я хотел быть перенаправленным на главную страницу, если ответ правильный, чтобы увидеть, работает ли форма правильно, но это не так. Где я допустил ошибку?
Я считаю, что ошибка здесь:
if request.POST.get("answer").strip() == instance.answer:
Который должен быть:
if request.POST.get("answer").strip() == instance.answer_text:
Ваш instance является объектом Question, с полем answer_text, а не answer.
В вашем корневом urls.py также есть путь с 'name', и я не думаю, что он вам там нужен.
# change
path('', include('exam.urls'), name="home"),
# to this:
path('', include('exam.urls')),
Имя уже есть в вашем exam.urls.py.