Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django分页返回所有元素,但仍然分页_Python_Django_Pagination - Fatal编程技术网

Python Django分页返回所有元素,但仍然分页

Python Django分页返回所有元素,但仍然分页,python,django,pagination,Python,Django,Pagination,我试图用django做一些简单易行的事情: 对项目列表进行分页 因此,我有一个文章页面,我希望每页最多显示10篇文章,下一页=10篇下一篇文章,等等 您可以按某些类别对其进行排序,如来源或日期 因此,当我到达mydomaine.com/articles/时,我会显示所有元素 如果我按来源排序,如views.py所示: class SourceEntriesView(ContextSourcesMixin, BaseArticleView, BaseArticleListView): model

我试图用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中传递分页的_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 %}
{%if-article\u list%}
{文章列表%中的文章为%0}
{{文章日期{实现日期:{fd,Y}}
{{article.source}
{article.regions.all%中区域的%s}
{{region.name}
{%endfor%}
{{article.title}}
{%endfor%}
{%if已分页%}
第{{Page_obj.paginator.num_pages}页中的第{{Page_obj.number}页。
{%如果页面_obj.has_next%}
{%endif%}
{%endif%}
{%endif%}
因此,我有两个问题:

  • 为什么它没有显示在主要文章列表上
  • 为什么在选择源之后,如果单击“下一步”,所有项目都会显示出来

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

    因此,目前我有一个临时解决方案,即:

    {% 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 %}
    
    {page_obj.object_list%}中文章的%
    {{文章日期{实现日期:{fd,Y}}
    {{article.source}
    {article.regions.all%中区域的%s}
    {{region.name}
    {%endfor%}
    {{article.title}}
    {%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 %}
    
    {%用于文章列表%中的文章]
    {{文章日期{实现日期:{fd,Y}}
    {{article.source}
    {article.regions.all%中区域的%s}
    {{region.name}
    {%endfor%}
    {{article.title}}
    {%endfor%}
    

    物品清单变成了物品清单。我对它不是很满意,因为当我阅读文档时,这应该不是必需的。

    我假设您使用的是MultipleObjectMixin

    在这种情况下,分页是在调用
    context.update(self.get\u context\u data(form=form))
    时发生的。请参见此处的来源:

    因此,当您调用此函数时,它会将上下文['object_list']设置为分页内容。不幸的是,当您调用
    上下文['object\u list']=self.object\u list
    时,会在几行之后覆盖它,因为self.object\u list不受分页的影响。因此,如果删除这一行,就可以了

    编辑:似乎您使用的是“文章列表”而不是“对象列表”,以下是其他注释:

    • 在您最初的函数中,最后您有了“page”,它指的是righ分页函数,还有“article_list”和“object_list”,它指的是我解释过的完整的文章列表
    • 在我的解决方案中,“页面”和“文章列表”仍然保持不变,但“对象列表”指的是正确分页的列表。不幸的是,我没有注意到它不是您在模板中使用的那个
    • 因此,现在您所要做的就是将
      context[self.context\u object\u name]=self.object\u list
      替换为
      context[self.context\u object\u name]=context['object\u list']
      ,它将起作用:)

    问题没有明确描述:当您转到错误视图(ArticleListView)时,您没有任何结果?然后,当你选择一个源时,你突然发现所有的结果都没有分页?在错误的视图中,我显示了我所有的文章,没有分页,当我选择一个源时,它被分页。好的,我现在明白了,我想我发现了问题,所以我建议了一个解决方案。是的,我尝试了这个,idk为什么,但它也不起作用。目前,我唯一的解决方案就是这个答案下面的一个:(我编辑了这篇文章来解释为什么会这样以及如何纠正它,只是上下文键和值的问题:)