2016-02-11 15 views
7

Sự cố phức tạp một chút. Trong thực tế, tôi không cố gắng để tái phát minh ra bánh xe và kể từ khi dev back-end trái Tôi đang cố gắng hết sức để không phá hủy mã của mình.Django views.py cập nhật phân trang từ lựa chọn danh mục trong chế độ xem dựa trên lớp học

Nhưng, tôi nghĩ lần này tôi sẽ cần phải thay đổi rất nhiều thứ. Hoặc có lẽ câu trả lời là khá đơn giản và hồ của tôi kinh nghiệm chơi với tôi.

Về cơ bản, tôi có danh sách các bài viết mà bạn có thể sắp xếp theo danh mục.

tôi sắp xếp những cách này trong các URL:

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

và URL chính là mydomain.com/en/press/

Vì vậy, về cơ bản, khi tôi cố gắng sắp xếp bài viết của tôi bởi nguồn khác nhau, ví dụ, tôi có bài viết của tôi theo danh mục này hiển thị. Nhưng phân trang vẫn có tất cả các bài báo.

Vì vậy, nếu chỉ có một bài viết trong danh mục, bài viết duy nhất này được hiển thị nhưng "nút LoadMore" của tôi không bị vô hiệu hóa vì nó đang xem xét có nhiều bài viết hơn.

Sau đây là các hiệu trưởng xem views.py cơ sở hạng nhất, đầu tiên trên cơ sở:

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) 

Và xem danh sách mục chung:

#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 

Và bạn có thể thấy rằng các nút loadmore là cập nhật tại dòng này:

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

kết thúc FI NALLY lớp học quản lý các nguồn được sắp xếp:

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 

Vì vậy, lớp cuối cùng này gọi ajax - từ URL - khi bạn chọn nguồn. Nhưng làm cách nào để cập nhật nút tải thêm từ đây? Tôi đang bị lạc.

Sau khi đọc tài liệu về chế độ xem trang và lớp cơ sở, kết luận của tôi sẽ xóa các dòng đó. Nhưng tôi sợ phá vỡ mọi thứ và tôi sẽ không thể làm cho nó hoạt động đúng.

Vì vậy, câu hỏi của tôi là cách tốt nhất để cập nhật phân trang để sắp xếp theo một số danh mục đối tượng là gì?

Cảm ơn bạn trước, ít nhất là dành thời gian cho yêu cầu của tôi.

Trả lời

3

Vì vậy, vì nó khá phức tạp (nhưng cuối cùng là không) tôi viết lại mọi thứ.

Và giờ nó hoạt động, trở lại vào ngày cũ tốt (xóa/mã lại).

Nhờ tất cả những người dành thời gian đọc yêu cầu của tôi, ngay cả khi không may là không ai có thể đưa ra câu trả lời!

Các vấn đề liên quan