0

https://docs.djangoproject.com/en/dev/topics/pagination/の例に従って、ページ付けを機能させようとしています。クエリを使用していますが、クエリデータを後続のページに渡すことができないようです。最初のページは期待どおりに10件の結果に制限されたクエリを返しますが、次のページは単に空白のテーブルを返します。

  • バージョン:Django1.4.4およびpython2.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})

URL:

(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 に答える