2017-05-29 33 views
1

我有一個問題,當有人在我的搜索框(對應於'搜索'視圖)做一個搜索。 「搜索」一詞正在被「搜索類別」視圖拾取,並嘗試使用「搜索」這個詞來運行查詢來代替匹配。我想我可以看到它爲什麼會發生 - 實質上,搜索和search_category視圖都在我的url後查找一個詞。我只是困惑,爲什麼實際的意見沒有得到拾取和URL的混合起來?下面是我的看法,以及:儘管具體視圖Django的URL衝突

我的URL模式

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必須匹配一個視圖,否則它會模糊不清,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,但仍然困惑爲什麼它甚至很重要。 –