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