在Django中临时修改模型的字段值

时间:2014-06-01 17:03:28

标签: python django django-models django-queryset

我遇到了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标签的情况下过滤笔记?

1 个答案:

答案 0 :(得分:2)

filter返回一个全新的QuerySet,因此您在上一个QuerySet中更改的所有内容都将被遗忘。

让我提出一个不同的方法:

class Note(models.Model):
    text = models.TextField()
    ...

    def text_without_tags(self):
        return re.sub("<.*?>", "", self.text)

当您需要没有标记的字段内容时,请使用此方法。这更清晰:修改变量就是结束写 spaghetti代码的方法。

修改

尝试使用Bleach而不是正则表达式。