John Rogerson
John Rogerson

Reputation: 1183

Django URL Conflict Despite Specific Views

I'm having an issue when someone goes to do a search in my search box (which corresponds to the 'search' view). The word 'search' is getting picked up by the 'search_category' view and trying to run the query using the word 'search' to match instead. I think i can see why it is happening--essentially the search and search_category views are both looking for a word after my url. I'm just confused as to why the actual views are not getting picked up and the URL's are being mixed up? Here are my views as well:

My 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'),
]

my views:

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})

Upvotes: 1

Views: 523

Answers (1)

Stanislav Filin
Stanislav Filin

Reputation: 124

Try this order:

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'),
]

Upvotes: 2

Related Questions