【问题标题】:Django 1.4 Pagination with a queryDjango 1.4 带查询的分页
【发布时间】:2013-02-18 01:52:24
【问题描述】:

我正在尝试按照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

【问题讨论】:

  • 它引用了一个较早的函数作为我的搜索逻辑的一部分。我将添加代码。

标签: django pagination python-2.6 django-1.4 django-q


【解决方案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>

【讨论】:

  • 感谢您的回复,但我仍然得到相同的结果。第一页返回我的查询数据,第二页表格为空白。
  • 嗨,Catherine,这是包含表格 + 分页的表单。此查询捕获的 I 16 个条目。
  • 嗨,凯瑟琳,太好了,这让我更接近了。唯一的事情是当我转到下一页时,我失去了过滤器。例如,当我按路由器搜索时,第一页仅显示路由器,但第 2 页显示路由器和交换机。不过,我可以看到您要做什么。
  • 嗨,Catherine,我尝试了您的建议,但现在没有任何结果 :( 这就是我添加模板标签的方式,这是您的意思吗?请参阅模板标签测试。
  • @JasonK 你能把你的整个项目发给我的 gmail 吗?我很容易跟踪您的代码并轻松修复它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-28
  • 2021-05-02
  • 1970-01-01
  • 2012-08-27
  • 2012-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多