0

我正在尝试按照https://docs.djangoproject.com/en/dev/topics/pagination/中的示例使分页工作。我正在使用查询,似乎无法将查询数据传递给连续的页面。第一页按预期返回我的查询限制为 10 个结果,但下一页只返回一个空白表。

  • 版本:Django 1.4.4 和 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
4

1 回答 1

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>
于 2013-03-04T02:46:24.263 回答