2016-05-27 45 views
0

models.pyDjango的 - 搜索表單

class Location(models.Model): 
    user = models.ForeignKey(User) 
    name = models.CharField(max_length=100, verbose_name=u"Локация", default=u'') 
    keywords = models.CharField(max_length=100, verbose_name=u"Ключевые слова") 

forms.py

class AdvancedSearchForm(forms.Form): 
    location = forms.CharField() 
    keywords = forms.CharField() # e.g. 'spam,eggs,hum' 

views.py

class AdvancedSearchView(FormView): 
    form_class = AdvancedSearchForm 
    template_name = "advanced_search.html" 
    success_url = '/search_location/result/' 

# url of this view is 'search_result' 
class SearchResultView(TemplateView): 
    template_name = "search_result.html" 

    def get_context_data(self, **kwargs): 
     context = super(SearchResultView, self).get_context_data(**kwargs) 
     location = self.request.GET['location'] 
     location = location.upper() 
     keywords = self.request.GET['keywords'] 
     # how should I use keywords (string of words split by commas) 
     # in order to get locations_searched by name and keywords simultaneously 
     locations_searched = Location.objects.filter(name=location) 
     context['locations_searched'] = locations_searched 
     return context 

advanced_search.html

<form action="{% url 'search_result' %}" method="GET">{% csrf_token %} 
     {{ form|crispy }} 
     <button class="btn btn-default" type="submit">Find</button> 
</form> 

search_result.html

{% for location in locations_searched %} 
     {{ location }}<br> 
     {{ location.user }}<br> 
     {{ location.keywords }}<br> 
{% endfor %} 

請解釋(或建議,我可以看看),我該怎麼辦投入,形成以獲得通過名稱和關鍵字定位的對象模型匹配的關鍵字和關鍵字。

例如,一些對象可以保留作爲關鍵字 - 「垃圾郵件,蛋」

和形式,我可以只輸入「垃圾郵件」或「一些,垃圾郵件」

我希望得到這個在這種情況下的對象

謝謝!

回答

0

在你看來:

from django.db.models import Q 
在get_context_data

然後:通過添加更多過濾方法來構建複雜的變種

Location.objects.filter(Q(name=location) | Q(keywords=keywords)) 

您也可以建立自己的查詢集更多的語句。

+0

謝謝!我有方向..但我仍然有疑問..在表達式Q(關鍵字=關鍵字)中,我們搜索了這種類型 - 例如如果某些用戶在創建對象時將字符串「垃圾郵件,雞蛋」放在了KEYWORDS字段中,那麼在搜索時我會放入「垃圾郵件,東西」形式 - 在這種情況下,搜索就像「垃圾郵件,雞蛋」=「垃圾郵件,東西」。但是我需要將模型中的每個單詞匹配到搜索形式中的每個單詞......並且即使我只同意一個單詞也想獲得對象 – Dennis

+0

對於記錄:IMO最好將關鍵字重構爲多對一關係。無論如何;在將分隔輸入以逗號分割爲'splitted_keywords'列表後,可以通過循環列表並將其添加到您的查詢集中來執行基於文本的搜索:Q(keywords__contains = first_splitted_keywords [loopindex])) – acidjunk