0

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.

python version

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 types 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;

valid answers

The request handled with $.ajax post method also DRF, and all request data is sended into backend.

binpy
  • 3,994
  • 3
  • 17
  • 54

1 Answers1

0

Here we go, the problem is in the database for somehow it added by \r. So, I need to replace it. In my test, I'm trying to print out them into list mode:

number = 0
for canswer in correct_answers:
    number += 1

    print([number, canswer.answer])
    print([number, user_answer])
    print('')

And the BIG problem was found, isn't same;

[1, 'from datetime import datetime\r\nnow = datetime.now()\r\nprint(now)']
[1, 'from datetime import datetime\n\nnow = datetime.now()\nprint(now)']

[2, 'from datetime import datetime\r\n\r\nnow = datetime.now()\r\nprint(now)']
[2, 'from datetime import datetime\n\nnow = datetime.now()\nprint(now)']

So, I just need to replace it;

for canswer in correct_answers:
    correct_answer = canswer.answer.replace('\r', '')
    user_answer = user_answer.replace('\r', '')

    if correct_answer == user_answer:
        return True
binpy
  • 3,994
  • 3
  • 17
  • 54