2017-05-29 8 views
1

誰かが検索ボックス(「検索」ビューに対応)で検索を行うと問題が発生します。単語 'search'は 'search_category'ビューで取得され、代わりに 'search'という単語を使用してクエリを実行しようとしています。私はなぜそれが起こっているのか分かると思います - 本質的にはsearchとcategory_categoryの両方の見解が私のURLの後ろの単語を探しています。私はちょうど実際のビューがピックアップされず、URLが混ざっている理由について混乱していますか?ここに私の見解は、同様に、次のとおりです。特定のビューにもかかわらずDjangoのURLの競合

マイurlpatterns

urlpatterns = [ 
    url(r'^(?P<letter>[a-zA-Z])/$', views.mineral_letter, name='letter'), 
    url(r'^(?P<category>[a-zA-Z\s]+)/$', views.search_category, name='category'), 
    url(r'^$', views.mineral_list, name='list'), 
    url(r'^(?P<pk>\d+)/$', views.mineral_detail, name='detail'), 
    url(r'^search/$', views.search, name='search'), 
] 

私の見解:

def mineral_list(request): 
    minerals = Mineral.objects.all() 
    return render(request, 'minerals/mineral_list.html', {'minerals': minerals}) 


def mineral_detail(request, pk): 
    mineral = Mineral.objects.get(pk=pk) 
    return render(request, 'minerals/mineral_detail.html', {'mineral': mineral}) 


def mineral_letter(request, letter): 
    minerals = Mineral.objects.filter(name__istartswith=letter.lower()) 
    return render(request, 'minerals/mineral_list.html', {'minerals': minerals, 'active_letter':letter}) 


def search(request): 
    term = request.GET.get("q") 
    minerals = Mineral.objects.filter(name__icontains=term) 
    return render(request, 'minerals/mineral_list.html', {'minerals': minerals}) 


def search_category(request,category): 
    minerals = Mineral.objects.filter(category__icontains=category) 
    return render(request,'minerals/mineral_list.html', {'minerals':minerals}) 
+2

ないDjangoのプロが、上記検索ビューを移動しますカテゴリビューで修正される可能性があります。私は彼らがカテゴリーの単語 "検索"でカテゴリが選ばれたラウンドのもう一つの方法だからだと思います。 –

+0

あなたはそれを釘付けにしました。ありがとうございました! (それでもうまくいかない理由は分かっていますが、私はそれに伴います!) –

+1

マッチしたものを見つけた後の見た目が止まってしまい、検索ビューに実際には出てこないので問題です。それはあなたがそれについて考えるなら、URLが1つのビューに一致しなければならない、そうでなければあいまいであるかもしれない、djangoはあなたにこの種の問題を避けるように強制しています。 –

答えて

2

この順序を試してみてください:

urlpatterns = [ 
    url(r'^$', views.mineral_list, name='list'), 
    url(r'^search/$', views.search, name='search'), 
    url(r'^(?P<letter>[a-zA-Z])/$', views.mineral_letter, name='letter'), 
    url(r'^(?P<category>[a-zA-Z\s]+)/$', views.search_category, name='category'), 
    url(r'^(?P<pk>\d+)/$', views.mineral_detail, name='detail'), 
] 
+0

あなたは間違いなく正しいです - 再注文はトリックでした。私はdjangoがこの順序を使ってURLを1つずつ実行することを理解していると思うが、なぜそれが重要なのかはまだ混乱している。 –

関連する問題