2017-04-16 10 views
0

私のテンプレートでは、「検索」タイプの入力を使用しています。アクションが実行されると、ページ「/search_results.html」が返されます。Django URL from HTML検索フォーム

問題は、URLの末尾に/?search = yoursearchを追加することです。 8000/search_results /リンゴを、それが単語のリンゴを含む結果を返します。

私のURLパターンは、私はlocalhostを入力するのであれば、今

url(r'^search_results/(?P<search>\w+)/$, views.SearchView, name='search') 

です。しかし、検索バーを使ってappleを検索すると、localhost:8000/search_results /?search = appleが返されますが、これは有効なURLではありません。私は代わりに

(?P<search>.*) 

を使用しようとしましたが、リダイレクトが多すぎると言いました。

誰かがDjangoで検索結果の値を使用する方法を知っていますか?または、等号の後にビットを解析できるようにURLを配置する方法はありますか?ありがとう

+0

でこれを追加することですあなたの意見がどのように結びついているかによって異なります。 – karthikr

答えて

1

全くわからないものを、あなたの目標はあるが、一致するURLがrequest.META["QUERY_STRING"]経由でリクエストオブジェクトにアクセスすることができますクエリ文字列を(無視ジャンゴとき、私は知っている。ここでは検索のために少し例ハンドラです。
urls.py

from django.conf.urls import url 
from . import views 
urlpatterns = [ 
    url(r'^/search_results',views.search_handler) 

views.py

def search_handler(request): 
    query = {} 
    for i in request.META["QUERY_STRING"].split("&"): 
     query[i.split("=")[0]] = i.split("=")[1] 
    search = query["search"] 
    # your code here 
+0

これは私が欲しかったのとまったく同じように思えますし、それはかなりシンプルです!フォローアップの質問では、複数単語の検索を処理するときに+ inbetweenの単語が追加されます。私が "これをテストする"を検索すると、searchは値test + thisを取得します。私はプラス記号や何かで検索を分割することでそれを理解することができるだろうと確信していますが、もしあなたが偉大な助言をしているならば。 – Chris

+0

@Chris、私は分割はおそらく最善の方法だと思います。これがあなたのために働くなら、あなたは私の答えを正確にマークできますか?ありがとう! –

0

あなたのHTMLフォームでは、メソッドを取得または投稿していますか?

<form method="post"> 
</form> 
0

urls.pyで今

def search(request): 
    books = Mymodel.objects.all() 
    query_string = '' 
    found_entries = None 
    source = "" 

    # the 'search' in this request.GET is what appears in the url like 
    #localhost:8000/?search=apple. 
    if ('search' in request.GET) and request.GET['search'].strip(): 
     query_string = request.GET['q'] 
     entry_query = get_query(query_string, [list, of, model, field, to, search]) 
    found_entries = Mymodel.objects.filter(entry_query) 

    context = { 
     'query_string': query_string, 
     'found_entries': found_entries, 
    } 

    return render(request, 'pathto/search.html', context) 

を編集するには、検索ビュー

views.py

# no need to edit this 
def normalize_query(query_string, 
       findterms=re.compile(r'"([^"]+)"|(\S+)').findall, 
       normspace=re.compile(r'\s{2,}').sub): 
    ''' Splits the query string in invidual keywords, getting rid of 
     unecessary spaces and grouping quoted words together. 
    ''' 
    return [normspace(' ', (t[0] or t[1]).strip()) for t in findterms(query_string)] 


# no need to edit this 
def get_query(query_string, search_fields): 
    ''' Returns a query, that is a combination of Q objects. That combination aims to search keywords within a model by testing the given search fields.''' 

    query = None # Query to search for every search term 
    terms = normalize_query(query_string) 

    for term in terms: 
     or_query = None # Query to search for a given term in each field 
     for field_name in search_fields: 
      q = Q(**{"%s__icontains" % field_name: term}) 
      if or_query is None: 
       or_query = q 
      else: 
       or_query = or_query | q 
     if query is None: 
      query = or_query 
     else: 
      query = query & or_query 
    return query 
であなたが必要なすべてのURLパターン

url(
    regex=r'^search/$', 
    view = search, 
    name = 'search' 
),