python - Django views.py 从基于类的 View 中的类别选择更新分页

标签 python django django-views

这个问题有点复杂。 事实上,我并不是要重新发明轮子,自从后端开发人员离开后,我会尽力不破坏他的代码。

但是,我想这次我需要改变很多东西。或者也许答案很简单,我的经验湖对我不利。

基本上,我有一个文章列表,您可以按类别对其进行排序。

我在 URL 中以这种方式排序:

urlpatterns = patterns(
  '',
  url(r'^$', ArticleListView.as_view(), name='articles-list'),
  url(r'^source/(?P<source>[\w\.@+-]+)/$', SourceEntriesView.as_view(), name='articles-source'),
  url(r'^date/(?P<daterealization>[\w\.@+-]+)/$', DateEntriesView.as_view(), name='articles-date'),
  url(r'^country/(?P<region>[\w\.@+-]+)/$', RegionEntriesView.as_view(), name='articles-region'),
  url(r'^global/$', GlobalEntriesView.as_view(), name='articles-global'),
)

主要 URL 是 mydomain.com/en/press/

基本上,例如,当我尝试按来源对我的文章进行排序时,我会按此类别显示我的文章。但是分页仍然有所有文章。

因此,如果该类别中只有一篇文章,则只显示这篇文章,但我的“加载更多按钮”不会被禁用,因为它正在考虑后面还有更多文章。

这里是 views.py 基类 View 的主体,首先是基类:

class BaseArticleListView(ListView):
"""
Base article list view for manage ajax navigation
"""
model = Article
context_object_name = 'article_list'
template_name = 'base_templates/template_press.html'
paginate_by = get_setting('PAGINATION')

def get_load_more_url(self, request, context):
    args = request.GET.copy()
    page_obj = context.get('page_obj', None)

    if not page_obj or not page_obj.has_next():
        return ''

    args[self.page_kwarg] = page_obj.next_page_number()

    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)

以及通用列表条目 View :

#Main article display view 
class ArticleListView(FormMixin, BaseArticleView, BaseArticleListView, ContextSourcesMixin):
  model = Article
  view_url_name = 'djangocms_press:articles-list'
  form_class = SourcesRegionsFilterForm

  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[self.context_object_name] = context['object_list']

    source_qs = ArticleSource.objects.active_translations(get_language()).order_by('translations__name')
    date_realization_for_articles = Article.objects.values_list('date_realization',
                                                        flat=True).distinct()
    region_for_articles = Country.objects.exclude(regions_press_article=None).order_by('name')

    context['load_more_url'] = self.get_load_more_url(request, context)
    context['dates_realization'] = date_realization_for_articles.dates('date_realization', 'month', order="DESC")
    context['sources_list'] = source_qs
    context['regions_list'] = region_for_articles

    return self.render_to_response(context)

  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

你可以看到 loadmore 按钮在这一行更新了:

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

最终结束管理排序源的类:

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

  def get(self, *args, **kwargs):
    # submit object to cms toolbar to get correct language switcher behavior
    if hasattr(self.request, 'toolbar'):
        self.request.toolbar.set_object(self.source)
    return super(SourceEntriesView, self).get(*args, **kwargs)

  @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
    context = super(SourceEntriesView, self).get_context_data(**kwargs)
    return context

因此,当您选择源时,最后一个类是通过 URL 在 ajax 中调用。但是如何从这里更新加载更多按钮?我迷路了。

阅读有关分页和基类 View 的文档后,我的结论是删除这些行。但我害怕破坏一切,我将无法使其正常工作。

所以,我的问题是更新分页以按某些类别对对象进行排序的最佳方法是什么?

提前感谢您,至少感谢您花时间处理我的请求。

最佳答案

因此,由于它非常复杂(但最终不是),我重写了所有内容。

现在它可以正常工作了,回到过去的美好时光(再次删除/编码)。

感谢所有花时间阅读我的请求的人,即使不幸的是没有人能给出答案!

关于python - Django views.py 从基于类的 View 中的类别选择更新分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35347396/

相关文章:

python - 导入错误 : No module named tweepy

django - 如何在查询中比较模型的两个字段?

django - 如何在查询性能目的中使用 Django 分页器?

使用 HttpResponseRedirect 的 Django 表单重定向

django - 如何使用 Django 保护他的 AJAX View ?

django - 如何通过 Django 中的模型属性之一对对象数组进行分组?

django - 此数据库后端不支持 DISTINCT ON 字段

python - 使用python同时播放两个正弦音

python - 如何在 Python 中创建一个 csv 文件,并将其导出(放入)到某个本地目录

python - 如何以可读的方式指定大整数文字?