Django QuerySet出现问题:
为了不使搜索结果变得一团糟,我首先使用以下代码从文本中删除了所有HTML标记:
re.sub("<.*?>", "", note.text)
效果很好。
我需要修改所有注释,并在搜索完成后将其还原。
我尝试了这段代码:
def remove_tags(notes):
for note in notes:
note.text = re.sub("<.*?>", "", note.text)
return notes
notes = remove_tags(Note.objects.all()) # Remove HTML tags in all the notes
# ...
found = notes.filter( # By the some reason it restores default value here
Q(text__icontains=q) |
Q(title__icontains=q)
)
示例文字:
<span style="text-decoration:line-through">Todo</span>
当我尝试在调用remove_tags之后立即访问文本时,一切似乎都很好:
notes = remove_tags(Note.objects.all())
print(notes[0].text) # Will print 'Todo'
但是当我在调用过滤器后执行此操作时,它看起来像以前一样:
notes = remove_tags(Note.objects.all())
print(notes[0].text) # Will print 'Todo'
filtered = notes.filter(text__icontains="line-through")
print(filtered[0].text) # Will print '<span style="text-decoration:line-through">Todo</span>'
如何过滤没有HTML标签的笔记?
最佳答案
filter
返回一个全新的QuerySet,因此您在上一个QuerySet中更改的所有内容都将被忘记。
让我提出另一种方法:
class Note(models.Model):
text = models.TextField()
...
def text_without_tags(self):
return re.sub("<.*?>", "", self.text)
当您需要不带标签的字段内容时,请使用此方法。这更干净:在原位修改变量是结束编写意大利面条代码的方法。
编辑:
尝试使用Bleach之类的方法代替正则表达式。
关于python - 在Django中临时修改模型的字段值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23982288/