我已经为此挣扎了一段时间。我试图用分页实现django搜索。分页有效,但是当我尝试搜索某些内容时,我会收到此错误:
Course matching query does not exist.
这是追溯:https://pastebin.com/jjp2hlus
和代码:
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
def pagination(request, data, num=10):
paginator = Paginator(data, num)
page = request.GET.get('page')
try:
courses = paginator.page(page)
except PageNotAnInteger:
courses = paginator.page(1)
except EmptyPage:
courses = paginator.page(paginator.num_pages)
index = courses.number - 1
max_index = len(paginator.page_range)
start_index = index - 5 if index >= 5 else 0
end_index = index + 5 if index <= max_index - 5 else max_index
page_range = paginator.page_range[start_index:end_index]
return courses, page_range
def search(request):
query = request.GET.get('q')
if query:
results = Course.objects.filter(Q(name__icontains=query))
else:
results = Course.objects.get()
pages = pagination(request, results, num=1)
context = {
'courses': pages[0],
'page_range': pages[1],
'query': query,
}
return render(request, 'courses/index.html', context)
def courses(request, slug):
query = Course.objects.get(slug=slug)
context = {'courses': Course.objects.filter(slug=slug),
'lectures': query.lectures.order_by('lecture_category'),
}
return render(request, 'courses/courses.html', context)
url:
urlpatterns = [
path('', views.index, name='index'),
re_path('(?P<slug>[w-]+)/', views.courses, name='courses'),
path('results/', views.search, name="search"),
]
url"/result/"匹配courses
的模式,以便调用该视图。您应该交换订单,以使Django首先与字符串"结果"匹配。
另外,如果您使用的是"路径",最好保持一致并在整个过程中使用-Django在新格式中包含" slug"类型。所以:
urlpatterns = [
path('', views.index, name='index'),
path('results/', views.search, name="search"),
path('<slug:slug>/', views.courses, name='courses'),
]
最后,请注意,您的结果URL没有捕获" slug"参数,因此您的视图不应该期望,并且您不应该在搜索查询中使用它。