2013-03-04 66 views
0

我試圖讓分頁工作遵循https://docs.djangoproject.com/en/dev/topics/pagination/中的示例。我正在使用查詢,似乎無法將查詢數據傳遞給連續頁面。第一頁按預期返回限制爲10個結果的查詢,但下一頁僅返回一個空白表。Django 1.4分頁查詢

  • 版本:1.4.4的Django和Python 2.6.6

代碼:

from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger 

def search(request): 
    query_string = '' 
    found_entries = None 
    if ('q' in request.GET) and request.GET['q'].strip(): 
      query_string = request.GET['q'] 

      entry_query = get_query(query_string, ['id', 'address', 'itemcode', 'qty', 'description', 'metatags' ]) 

      found_entries = inventory.objects.filter(entry_query).order_by('-qty') 
      paginator = Paginator(found_entries, 10) # Show 10 items per page 

      page = request.GET.get('page') 
      try: 
        found_entries = paginator.page(page) 
      except PageNotAnInteger: 
        # If page is not an integer, deliver first page. 
        found_entries = paginator.page(1) 
      except EmptyPage: 
        # If page is out of range (e.g. 9999), deliver last page of results. 
        found_entries = paginator.page(paginator.num_pages) 


    return render_to_response('dynamite_frontpage.html', {"found_entries": found_entries}) 

網址:

(r'^search/$', 'dynamite.views.search'), 

我的模板設置正確,當我排除查詢並顯示所有結果分頁工作 - 例如:

def search(request): 
    found_entries = inventory.objects.all().order_by('-qty') 
    paginator = Paginator(found_entries, 10) # Show 10 items per page  

    page = request.GET.get('page') 
    try: 
      found_entries = paginator.page(page) 
    except PageNotAnInteger: 
      found_entries = paginator.page(1) 
    except EmptyPage: 
      found_entries = paginator.page(paginator.num_pages) 

    return render_to_response('dynamite_frontpage.html', {"found_entries": found_entries}) 

在此先感謝。

搜索功能:

def normalize_query(query_string, 
       findterms=re.compile(r'"([^"]+)"|(\S+)').findall, 
       normspace=re.compile(r'\s{2,}').sub): 
''' Splits the query string in invidual keywords, getting rid of unecessary spaces 
    and grouping quoted words together. 
    Example: 

    >>> normalize_query(' some random words "with quotes " and spaces') 
    ['some', 'random', 'words', 'with quotes', 'and', 'spaces'] 

''' 
return [normspace(' ', (t[0] or t[1]).strip()) for t in findterms(query_string)] 

def get_query(query_string, search_fields): 
''' Returns a query, that is a combination of Q objects. That combination 
    aims to search keywords within a model by testing the given search fields. 

''' 
query = None # Query to search for every search term   
terms = normalize_query(query_string) 
for term in terms: 
    or_query = None # Query to search for a given term in each field 
    for field_name in search_fields: 
     q = Q(**{"%s__icontains" % field_name: term}) 
     if or_query is None: 
      or_query = q 
     else: 
      or_query = or_query | q 
    if query is None: 
     query = or_query 
    else: 
     query = query & or_query 
return query 
+0

什麼'get_query'? – 2013-03-04 05:05:20

+0

它指的是一個早期的函數,作爲我的搜索邏輯的一部分。我將添加代碼。 – JasonK 2013-03-04 05:08:49

回答

1
from django.core.paginator import Paginator, InvalidPage, EmptyPage 

def search(request): 
    found_entries = inventory.objects.filter() 

    if request.GET.get('q'): 
     query_string = request.GET.get('q') 
     found_entries = found_entries.filter(
       id__icontains=query_string 
      ).filter(
       address__icontains=query_string 
      ).filter(
       itemcode__icontains=query_string 
      ).filter(
       qty__icontains=query_string 
      ).filter(
       description__icontains=query_string 
      ).filter(
       metatags__icontains=query_string 
      ).order_by('-qty') 

    paginator = Paginator(found_entries, 10) # Show 10 items per page 

    try: 
     page = int(request.GET.get('page', '1')) 
    except ValueError: 
     page = 1 

    try: 
     found_entries = paginator.page(page) 
    except (EmptyPage, InvalidPage): 
     found_entries = paginator.page(paginator.num_pages) 

    return render_to_response('dynamite_frontpage.html', { 
     "found_entries": found_entries, 
    }) 

在模板:

<input name="q" type="text" value="{{ request.GET.q }}"> 

模板標籤測試:

<form class="form-searchbar" method='get' action='/search/'> 
    <input name="q" type="text" value="{{ request.GET.q }}"> 
</form> 
+0

感謝您的回覆,但我仍然得到相同的結果。第一頁返回我的查詢數據,第2頁表格爲空。 – JasonK 2013-03-04 04:19:19

+0

嗨凱瑟琳,這裏是包含表+分頁的表格。我通過此查詢捕獲了16個條目。 – JasonK 2013-03-04 04:53:41

+0

對不起,剛添加它 – JasonK 2013-03-04 04:58:06