Reputation: 39
I have a page ".com/listings" that loads well, but when I run a query through the form, it produces this error:
Page not found (404) Request Method: GET Request URL: http://127.0.0.1:8000/listings/search?keywords=&city=Corpus+Christi Raised by: listings.views.listing
It should render a ".com/listings/search" page.
Previously I had it working beautifully, but after I successfully changed the url path of single listings page - "listings/listing" to a string from an integer, it caused this problem for my search page. Could be a coincidence, but I believe it could be connected.
urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='listings'),
path('<str:listing_title>', views.listing, name='listing'),
path('search', views.search, name='search'),
]
views.py
from django.shortcuts import get_object_or_404, render
from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
from .choices import price_choices, city_choices, bed_choices, bath_choices
from .models import Listing
from agents.models import Agent
from contacts.models import Contact
def index(request):
listings = Listing.objects.order_by('-list_date').filter(is_published=True)
paginator = Paginator(listings, 6)
page = request.GET.get('page')
paged_listings = paginator.get_page(page)
context = {
'listings': paged_listings,
'price_choices': price_choices,
'city_choices': city_choices,
'bed_choices': bed_choices,
'bath_choices': bath_choices
}
return render(request, 'listings/listings.html', context)
def listing(request, listing_title):
listing = get_object_or_404(Listing, title=listing_title)
context = {
'listing': listing,
}
return render(request, 'listings/listing.html', context)
def search(request):
queryset_list = Listing.objects.order_by('list_date')
if 'keywords' in request.GET:
keywords = request.GET['keywords']
if keywords:
queryset_list = queryset_list.filter(description__icontains=keywords)
if 'city' in request.GET:
city = request.GET['city']
if city:
queryset_list = queryset_list.filter(city__icontains=city)
if 'pricerange' in request.GET:
pricerange = request.GET['pricerange']
if pricerange:
queryset_list = queryset_list.filter(price__lte=pricerange)
if 'bed' in request.GET:
bed = request.GET['bed']
if bed:
queryset_list = queryset_list.filter(bedrooms__lte=bed)
if 'bath' in request.GET:
bath = request.GET['bath']
if bath:
queryset_list = queryset_list.filter(bathrooms__lte=bath)
context = {
'price_choices': price_choices,
'city_choices': city_choices,
'bed_choices': bed_choices,
'bath_choices': bath_choices,
'listings': queryset_list,
'values': request.GET
}
return render(request, 'listings/search.html', context)
Upvotes: 0
Views: 172
Reputation: 4763
Django tries URL routes from top to bottom. So what is happening?
When the url http://127.0.0.1:8000/listings/search is summoned, Django is first trying
path('<str:listing_title>', views.listing, name='listing'),
and interpreting 'search' as the value of 'listing_title'. Because there is no listing named "search", the page returns a 404 error.
Change your urls.py
to
path('', views.index, name='listings'),
path('search', views.search, name='search'),
path('<str:listing_title>', views.listing, name='listing'),
And your code will work fine.
Upvotes: 2