2016-01-24 28 views
0

我想用django做一些简单容易的事情:Django分页返回所有元素,但仍然分页

有一个项目列表的分页。

所以,我有一篇文章页面,我想最多显示,每页10条,翻页= 10个一篇文章等

您可以通过一些类别,来源或日期排序。

所以,当我到达我的mydomaine.com/articles/我显示了我所有的元素。

如果我排序的来源,因为这views.py显示:

class SourceEntriesView(ContextSourcesMixin, BaseArticleView, BaseArticleListView): 
model = Article 
context_object_name = 'article_list' 
template_name = 'base_templates/template_press.html' 
_source = None 
paginate_by = get_setting('PAGINATION') 
view_url_name = 'djangocms_press:articles-source' 

@property 
def source(self): 
    if not self._source: 
     try: 
      source_qs = ArticleSource.objects.active_translations(
       get_language(), 
       slug=self.kwargs['source'] 
      ) 

      #source_qs = source_qs.filter(site=Site.objects.get_current().pk) 
      self._source = source_qs.latest('pk') 
     except ArticleSource.DoesNotExist: 
      raise Http404("ArticleSource does not exist for this site") 
    return self._source 

def get_queryset(self): 
    qs = super(SourceEntriesView, self).get_queryset() 
    if 'source' in self.kwargs: 
     qs = qs.filter(sources__pk=self.source.pk) 
    return qs 

def get_context_data(self, **kwargs): 
    kwargs['source'] = self.source 
    return super(SourceEntriesView, self).get_context_data(**kwargs) 

一旦Ajax调用是由加载此视图,并显示按来源分类的文章,我有我的10个项目! (好吧,我正在测试时使用4)。

那么为什么它不在主页上工作。

这里有更多的解释我的代码:

''' Main article display view ''' 
class ArticleListView(FormMixin, BaseArticleListView, ContextSourcesMixin): 
    model = Article 
    context_object_name = 'article_list' 
    template_name = 'base_templates/template_press.html' 
    view_url_name = 'djangocms_press:articles-list' 
    form_class = SourcesRegionsFilterForm 
    paginate_by = get_setting('PAGINATION') 


def get_form_kwargs(self): 
    return { 
     'initial': self.get_initial(), 
     'prefix': self.get_prefix(), 
     'data': self.request.GET or None, 
     'request': self.request, 
    } 

def get(self, request, *args, **kwargs): 
    """ 
    Handle the form submissions to filter by Sources and regions 
    First_object is use for pagination 
    """ 
    context = {} 

    self.object_list = self.get_queryset().order_by("-date_realization") 

    first_object = 0 

    if 'article' in self.request.GET: 
     try: 
      project_id = int(request.GET['article']) 
      context['article_render'] = self.object_list.get(pk=project_id) 
     except (Article.DoesNotExist, ValueError): 
      pass 

    form = self.get_form(self.form_class) 

    if form.is_valid(): 
     if form.cleaned_data['regions']: 
      self.object_list = self.object_list.filter(
       Q(regions__continent=form.cleaned_data['regions']) | Q(global_regions=True)).distinct() 

    context.update(self.get_context_data(form=form)) 

    context['load_more_url'] = self.get_load_more_url(request, context) 

    context[self.context_object_name] = self.object_list 
    context['object_list'] = self.object_list 
    source_qs = ArticleSource.objects.active_translations(get_language()) 
    context['sources_list'] = source_qs 
    date_realization_for_articles = Article.objects.values_list('date_realization', 
                 flat=True).distinct() 
    context['dates_realization'] = date_realization_for_articles.dates('date_realization', 'month', order="DESC") 

    return self.render_to_response(context) 

def get_load_more_url(self, request, context): 
    args = request.GET.copy() 
    return '?{}'.format(args.urlencode()) 

def render_to_json_response(self, context, **response_kwargs): 
    if 'current_app' not in context: 
     context['current_app'] = resolve(self.request.path).namespace 

    c = RequestContext(self.request, context) 

    html_items_list = render_to_string(
     'base_templates/template_press.html', 
     context, 
     context_instance=c) 

    html_items_list = html_items_list.strip() 

    json_response = { 
     'html_items_list': html_items_list, 
     'load_more_url': self.get_load_more_url(self.request, context), 
    } 

    return JsonResponse(json_response) 

def render_to_response(self, context): 
    if self.request.is_ajax(): 
     response = self.render_to_json_response(context) 
    else: 
     response = super(ArticleListView, self).render_to_response(context) 
    return response 

这是显示文章的主要观点。

我的设置,非常简单但更容易使用:

def get_setting(name): 
    from django.conf import settings 
    from meta_mixin import settings as meta_settings 

    default = { 
    'PRESS_PAGINATION': getattr(settings, 'PRESS_PAGINATION', 4), 
    } 
    return default['PRESS_%s' % name] 

我也试图通过在文章列表的URL paginated_by但结果是一样的。

这里是我的模板的一部分猜想进行分页:

{% if article_list %} 
    <div id="articles-list" class="col-md-12"> 
     {% for article in article_list %} 
     <div class="row article"> 
      <div class="col-md-2"> 
       {{ article.date_realization|date:"F d, Y" }} 
      </div> 
      <div class="col-md-2"> 
       {{ article.source }} 
      </div> 
      <div class="col-md-2"> 
      {% for region in article.regions.all %} 
       {{ region.name }} 
      {% endfor %} 
      </div> 
      <div class="col-md-6"> 
       {{ article.title }} 
      </div> 
     </div> 
     {% endfor %} 
    </div> 
    {% if is_paginated %} 
    <section id="content-btn"> 
     <div id="load-more-btn blippar-white-btn" class="col-md-2 col-md-offset-5 col-xs-8 col-xs-offset-2" align="center"> 
       <a id="loadmore" role="button" class="button btn load-more-btn blippar-white-btn" href="{{ load_more_url }}">{% trans 'VIEW MORE' %}</a> 
     </div> 
    </section> 

    <div class="col-lg-12"> 

     <span class="current"> 
      Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}. 
     </span> 

     {% if page_obj.has_next %} 
      <a href="?page={{ page_obj.next_page_number }}">next</a> 
     {% endif %} 

    </div> 

    {% endif %} 
{% endif %} 

所以,我有2个问题:

  1. 为什么没有显示主力文章列表上?
  2. 为什么选择来源后,如果点击“下一步”,我的所有项目都会显示?

如果你有一个想法或反射的方向,我会喜欢它:)

+0

这个问题没有明确描述:当你去到错误的观点(ArticleListView)你没有任何结果?然后当你选择一个源时,你突然间所有的结果没有分页? – Mijamo

+0

在错误的观点,我有我的文章显示,没有分页,当我选择一个来源,它得到分页。 –

+0

好吧我现在明白了,我想我找到了问题,所以我提出了一个解决方案。 – Mijamo

回答

1

我假设你使用的是MultipleObjectMixin。

在这种情况下,当您拨打context.update(self.get_context_data(form=form))时会发生分页。请参阅源代码:https://github.com/django/django/blob/master/django/views/generic/list.py

因此,当您调用此函数时,它会将上下文['object_list']设置为分页内容。不幸的是,在你拨打context['object_list'] = self.object_list之后,你可以重写几行,因为self.object_list不受分页影响。如果你删除这行,它应该没问题。

编辑:看来你是使用“article_list”而不是“object_list中”,这里有更多的评论:

    在你原来的功能
  • ,你有“页”是指右击结束分页功能,以及'article_list'和'object_list',这些都是我所说的全部文章列表。
  • 在我的解决方案中,您仍然保持'网页'和'article_list'不变,但'object_list'指的是正确的分页列表。不幸的是,我没有注意到它不是你在模板中使用的那个。
  • 所以,现在你需要做的就是通过context[self.context_object_name] = context['object_list']更换context[self.context_object_name] = self.object_list,它会工作:)
+0

是的,我试过这个,并且idk为什么但它不工作。 目前,我唯一的解决方案是刚刚在这个答案:( –

+0

我编辑,以解释为什么是这样以及如何纠正它,只是一个问题的上下文键和值:) – Mijamo

+0

确实:)谢谢! –

0

因此,在现阶段,我有一个临时的解决办法是:

{% for article in page_obj.object_list %} 
     <div class="row article"> 
      <div class="col-md-2"> 
       {{ article.date_realization|date:"F d, Y" }} 
      </div> 
      <div class="col-md-2"> 
       {{ article.source }} 
      </div> 
      <div class="col-md-2"> 
      {% for region in article.regions.all %} 
       {{ region.name }} 
      {% endfor %} 
      </div> 
      <div class="col-md-6"> 
       {{ article.title }} 
      </div> 
     </div> 
     {% endfor %} 

而不是做:

{% for article in article_list %} 
    <div class="row article"> 
     <div class="col-md-2"> 
      {{ article.date_realization|date:"F d, Y" }} 
     </div> 
     <div class="col-md-2"> 
      {{ article.source }} 
     </div> 
     <div class="col-md-2"> 
     {% for region in article.regions.all %} 
      {{ region.name }} 
     {% endfor %} 
     </div> 
     <div class="col-md-6"> 
      {{ article.title }} 
     </div> 
    </div> 
    {% endfor %} 

article_list变成了object_list。我对此并不满意,因为当我阅读文档时,这不应该是必要的。