I actually want to check the answer from user is correct
or incorrect
.
When I tried in dummy data with pure python code, it work properly.
But, when I try to add it into django, it doesn't valid for multiple lines and only valid for one line.
I also tried 3 methods anyway, but still doesn't work. In my mind, perhaps because \n
issue.
I checked to both type
s of (correct_answer
& user_answer
), it gives me <class 'str'>
at all.
class UserAnswerView(APIView):
allowed_methods = ('post',)
permission_classes = (permissions.AllowAny,) # just for test
serializer_class = UserAnswerSerializer
def validate_answer(self, exercise_id, user_answer):
exercise = Exercise.objects.get_or_none(id=exercise_id)
if exercise and user_answer:
if isinstance(user_answer, str):
correct_answers = exercise.answer_set.published()
# [method 1]
# return correct_answers.filter(Q(answer__icontains=user_answer)).exists()
# [method 2]
# for correct_answer in correct_answers:
# if correct_answer.answer == user_answer:
# return True
# [method 3]
return any(c.answer == user_answer for c in correct_answers)
return False
Here is the models.py
;
class Exercise(TimeStampedModel):
id = models.BigAutoField(primary_key=True)
title = models.CharField(_('Title'), max_length=200)
order = models.PositiveIntegerField(_('Order'), default=1)
course = models.ForeignKey(Course, on_delete=models.CASCADE)
sort_description = models.TextField(_('Sort Description'))
description = models.TextField(_('Description'))
initial_script = models.TextField(_('Initial Script'), blank=True)
objects = CustomManager()
def __str__(self):
return self.title
class Answer(TimeStampedModel):
id = models.BigAutoField(primary_key=True)
exercise = models.ForeignKey(Exercise, on_delete=models.CASCADE)
answer = models.TextField(_('Answer'), help_text=_('The correct answer'))
objects = CustomManager()
def __str__(self):
return self.answer[:50]
In my test, I put this code into the user_answer
form and also correct_answer
.
from datetime import datetime
now = datetime.now()
print(now)
Anyway, I also put some valid answers in the database;
The request handled with
$.ajax
post method also DRF, and all request data is sended into backend.