Как разместить страницу в наборе данных - PullRequest
0 голосов
/ 10 июля 2011

Привет! Я хочу включить веб-нумерацию страниц, которая раньше работала и сломалась во время обновления среды или моей реализации (не знаю, какая именно). Я хочу разбить список на страницы, заказанные GAE Поскольку объекты, как правило, имеют «естественное упорядочение», то есть время, числа, слова и т. Д., Может ли этот код быть уже доступным для использования где-нибудь? Я попытался сделать что-то вроде примера от Джои Джи, который Google перечислил здесь: http://code.google.com/appengine/articles/paging.html Мои усилия, которые берут параметр под названием закладка из запроса URL:

  next = None
  bookmark = self.request.get("bookmark") 
  category = self.request.get('cg')#category parameter
  if bookmark:
    bookmark = datetime.strftime(bookmark[:-7], "%Y-%m-%d %H:%M:%S")  
  else:       
    bookmark = datetime.strftime(datetime.now(), "%Y-%m-%d %H:%M:%S") 

  if cg: 
    articles = Articles.all().filter("category =", cg).filter("modified >", timeline).filter("published =", True).filter("modified <=", bookmark ).order("-modified").fetch(PAGESIZE+1)    

Раньше это работало, и теперь разбиение по страницам прерывается, возможно, из-за того, что я не совсем понимаю, как обращаться с измененными объектами и объектами datetime. Не могли бы вы помочь мне в пути? URL-адрес моего варианта использования www.koolbusiness.com/li Спасибо

РЕДАКТИРОВАНИЕ / ОБНОВЛЕНИЕ: Вот текущий код, который отображает страницу списка. Он использует IN только в нескольких местах, так что, предположительно, он может быть переписан для работы без IN, сложность в том, что он так сильно разветвляется из-за множества возможных комбинаций, то есть поиска с или с nocategory, категории с или без поиска и также геопространственно, но я не думаю, что я пытаюсь сделать что-то невозможное, просто нужно больше изучать python (есть лямбда-программирование, которое я только вставил и не совсем понял) и получить более четкую структуру, когда все комбинации обрабатываются.

class I18NListPage(FBBaseHandler,I18NHandler):

  def get(self, cursor=None, limit=60, PAGESIZE = 10, twittername = None):
    client = OAuthClient('twitter', self) 
    if client.get_cookie():
      info = client.get('/account/verify_credentials')
      twittername = info['screen_name']
    if (users.is_current_user_admin()):
       timeline = datetime.now () - timedelta (days = limit)   
    else:
        timeline = datetime.now () - timedelta (days = limit)
    logo = ''             
    if util.get_host().endswith('.br'):
      cookie_django_language = 'pt-br'
      logo = 'montao'   
      translation.activate(cookie_django_language)
      self.request.COOKIES['django_language'] = cookie_django_language
      dispatch= 'template/montaoli.html'
    else:
        cookie_django_language = self.request.get('cookie_django_language', '') if self.request.get('cookie_django_language', '') else self.request.get('hl', '')
        dispatch= 'template/li.html'
    if cookie_django_language:
      if cookie_django_language == 'unset':
        del self.request.COOKIES['django_language']
      else:
        self.request.COOKIES['django_language'] = cookie_django_language
      self.reset_language()       
    next = None
    bookmark = self.request.get("bookmark") 
    if not bookmark:
       bookmark = = str(time.time())

    category = self.request.get('cg')
    q = self.request.get('q').encode("utf-8")
    w = self.request.get('q')
    cg = self.request.get('cg')
    t = self.request.get('t') 
    f = self.request.get('f')

    if cg and not t and not q and not f:#category without search
        ads = Ad.all().filter("category =", cg).filter("modified >", timeline).filter("published =", True).filter("modified <=", bookmark ).order("-modified").fetch(PAGESIZE+1)    
    elif q and not t and not cg and not f:#search without category
        ads = Ad.all().search(self.request.get('q')).filter("published =", True)    
        ads = filter(lambda x: x.modified > timeline, ads)
        ads = filter(lambda x: x.modified <= bookmark, ads)
        ads = ads[:PAGESIZE+1]
        ads = sorted(ads, key=lambda x: x.modified, reverse=True)
        #iterate list keeping elements that are on timeline newer than bookmark
    elif q and not t and cg and not f:
        ads = Ad.all().search(q).filter("type =", 's').filter("category =", cg).filter("modified >", timeline).filter("published =", True).filter("modified <=", bookmark ).order("-modified").fetch(PAGESIZE+1)    
    elif t and not f:
        ads = Ad.all().filter("type =", 'w').filter("modified >", timeline).filter("published =", True).filter("modified <=", bookmark ).order("-modified").fetch(PAGESIZE+1)    
    elif f == 'c':
        ads = Ad.all().filter("company_ad =", True).filter("modified >", timeline).filter("published =", True).filter("modified <=", bookmark ).order("-modified").fetch(PAGESIZE+1)
    elif f == 'p':
        ads = Ad.all().filter("company_ad =", False).filter("modified >", timeline).filter("published =", True).filter("modified <=", bookmark ).order("-modified").fetch(PAGESIZE+1)
    else:
        if util.get_host().find('onta') > 1:
            ads = Ad.all().filter("modified >", timeline).filter("published =", True).filter("url IN", ['www.montao.com.br','montao']).filter("modified <=", bookmark ).order("-modified").fetch(PAGESIZE+1)              
        else:
            ads = Ad.all().filter("modified >", timeline).filter("published =", True).filter("modified <=", bookmark ).order("-modified").fetch(PAGESIZE+1)
    if util.get_host().find('onta') > 1 and f == 'c':
        ads = Ad.all().filter("company_ad =", True).filter("modified >", timeline).filter("published =", True).filter("url IN", ['www.montao.com.br','montao']).filter("modified <=", bookmark ).order("-modified").fetch(PAGESIZE+1)
    elif util.get_host().find('onta') > 1 and f == 'p':
        ads = Ad.all().filter("company_ad =", False).filter("modified >", timeline).filter("published =", True).filter("url IN", ['www.montao.com.br','montao']).filter("modified <=", bookmark ).order("-modified").fetch(PAGESIZE+1)  


    if self.request.get('lat'):
        m=int(self.request.get('r')) if self.request.get('r') else 804670
        logging.info(m)
        lat = self.request.get('lat')
        lon = self.request.get('lon') if self.request.get('lon') else self.request.get('lng')
        ads = Ad.proximity_fetch(Ad.all().filter("modified >", timeline).filter("published =", True).filter("modified <=", bookmark ).order("-modified") ,db.GeoPt(lat, lon),max_results=PAGESIZE+1, max_distance=m)
        ads = sorted(ads, key=lambda x: x.modified, reverse=True)
    if ads and len(ads) == PAGESIZE+1:
      next = ads[-1].modified
      ads = ads[:PAGESIZE]     

    template_values = {'twittername':twittername,'request':self.request,'lat':self.request.get('lat'),'lon':self.request.get('lon'),'q':q,'w':w,'cg':cg,'t':t,'logo':logo,'ads':ads, 'next':next, 'user':users.get_current_user(), 'bookmark':bookmark,'q':q, 'user_url': users.create_logout_url(self.request.uri) if users.get_current_user() else 'login',
            'cg':category,'admin':users.is_current_user_admin(),}
    template_values.update(dict(current_user=self.current_user, facebook_app_id=FACEBOOK_APP_ID))
    path = os.path.join(os.path.dirname(__file__), dispatch)
    self.response.out.write(template.render(path, template_values))

ОБНОВЛЕНИЕ 2: я пытался использовать класс django paginator from paginator import Paginator, InvalidPage, EmptyPage, в этом случае следующий код фактически просматривает набор данных:

        articles = Articles.all()
        paginator = Paginator(articles,PAGESIZE)
        articles = paginator.page(page)

поэтому я нахожу это решение заманчивым, так как оно настолько легко и читаемо, и надеюсь, что вы можете комментировать дальше.

Ответы [ 2 ]

3 голосов
/ 11 июля 2011

Курсоры запросов созданы именно для этого.Вы должны использовать их вместо создания собственного решения.

1 голос
/ 12 июля 2011

Вам может понадобиться закодировать Base64 вашей закладки, прежде чем передать ее клиенту. Я пробовал [Ваш сайт] [1], но невозможно четко ответить на ваш вопрос без сообщения об ошибке на стороне сервера.

Более того, как уже упоминалось в статье подкачки, использование datetime в качестве закладки напрямую вызовет проблемы, если за один и тот же период времени будет опубликовано более одной статьи (в вашем случае период времени будет составлять одну минуту). Возможно, вы захотите использовать этот формат.

2008-10-26 04:38:00|aee15ab24b7b3718596e3acce04fba85

или использование секунд для представления времени.

1310427763.47|aee15ab24b7b3718596e3acce04fba85

мне установить значение datetime.now (), если это первая страница, которая просматривается?

Вы можете получить результаты первой страницы, просто проигнорировав измененный фильтр. Например:

if bookmark:
    suggestions = Suggestion.all().order("-when")
        .filter('when <=', bookmark).fetch(PAGESIZE+1)
else:
    suggestions = Suggestion.all().order("-when").fetch(PAGESIZE+1)

или используя текущее время в качестве закладки.

import time
bookmark = str(time.time())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...