如何解决无法在Django中检查多行字符串
我实际上想检查用户的答案是correct
还是incorrect
。
当我尝试使用纯python代码处理伪数据时,它可以正常工作。
但是,当我尝试将其添加到django中时,它对多行无效,而 仅对一行有效 。
无论如何我也尝试了3种方法,但仍然不起作用。在我看来,也许是因为\n
问题。
我检查了(type
和correct_answer
的两个user_answer
,它完全给了我<class 'str'>
。
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
这里是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]
在测试中,我将此代码放入了user_answer
表单中,也将其放入了correct_answer
。
from datetime import datetime
now = datetime.now()
print(now)
无论如何,我还在数据库中放置了一些 有效答案 ;
使用
$.ajax
post方法处理的请求也为DRF,并且所有请求数据都发送到后端。
解决方法
在这里,问题出在\r
以某种方式添加的数据库中。因此,我需要更换它。在测试中,我试图将它们打印为列表模式:
number = 0
for canswer in correct_answers:
number += 1
print([number,canswer.answer])
print([number,user_answer])
print('')
与发现的大问题不一样;
[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)']
所以,我只需要替换它;
for canswer in correct_answers:
correct_answer = canswer.answer.replace('\r','')
user_answer = user_answer.replace('\r','')
if correct_answer == user_answer:
return True
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。