2014-01-23 35 views
0

我在數據庫description中有一個字段,系統將在其中保存HTML代碼。使用Django ORM在HTML內容中搜索不考慮HTML標籤的值

,我有一個搜索系統,帶Q的工作原理:

Post.objects.filter(Q(name__icontains=keyword) | Q(description__icontain=keyword)) 

它工作正常,但問題是指它時,例如'<strong>''strong'用戶searchs它會返回在他們'<strong>'字行但它不應該考慮HTML標籤。

那麼如何在不考慮HTML標籤的Django ORM中搜索HTML內容中的值?

回答

1

我認爲這是一個很好的行動:

from django.utils.html import strip_tags 
rows = Post.objects.filter(Q(name__icontains=keyword) | Q(description__icontain=keyword)) 
if rows: 
    for j,i in enumerate(rows): 
     if keyword not in strip_tags(i.name) and keyword not in strip_tags(i.description): 
      del rows[j] 
return render(request,'posts.html',{'rows':rows}) 
  1. 獲取數據從數據庫中有過濾器。
  2. 帶標籤結果,然後再過濾它們。
2

我可能會添加第二個字段,名爲stripped_description,並使用django的striptags過濾器去除html標籤,並在該字段中進行django搜索。它應該仍然會找到所需的行來調用包含HTML代碼的實際description字段,如果需要顯示該結果,但這是我用來「忽略」html標籤的唯一方法。

+1

我想用'django.utils.html.strip_tags'代替'striptags'過濾器。 – juliocesar

+0

我認爲這個問題的最佳措施之一是過濾數據庫結果。意思是例如:在db中選擇django orm,然後使用其他python lib(如whoosh)過濾輸出。 – Mortezaipo

1

您可以或可能應該使用haystack來查找適當的搜索功能,如果您沒有執行核心搜索功能,我最喜歡的搜索引擎是使用它的是whoosh(pip安裝whoosh)。您可以定義的內容進行索引是這樣的:

{{ object.title }} 
{{ object.description|strip_tags }} 

這是相當容易安裝,而且一旦你做到了,爲下一個項目將在幾分鐘內設置。