2016-02-11 23 views
7

Il problema è un po 'complesso. In effetti, non sto cercando di re-inventare la ruota e dal momento che il back-end dev è partito sto facendo del mio meglio per non distruggere il suo codice.Django views.py aggiorna l'impaginazione da una selezione di categoria in una visualizzazione basata su classi

Ma, penso che questa volta avrò bisogno di cambiare molte cose. O forse la risposta è abbastanza semplice e il mio lago di esperienza gioca contro di me.

Fondamentalmente, ho un elenco di articoli che è possibile ordinare per categorie.

ho ordinato quelli in questo modo negli 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'), 
) 

e l'URL principale è mydomain.com/en/press/

Quindi, in pratica, quando si tenta di ordinare i miei articoli di fonti, per esempio, ho il mio articolo da questa categoria di visualizzazione. Ma l'impaginazione ha ancora tutto l'articolo.

Quindi, se c'è un solo articolo nella categoria, questo solo articolo viene mostrato ma il mio "pulsante LoadMore" non è disabilitato poiché si considera che ci sono più articoli dietro.

Qui ci sono i principi vista views.py della classe base, in primo luogo la base:

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) 

E il generico vista voce della lista:

#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 

e si può vedere che il pulsante è loadmore aggiornare a questa linea: FI

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

fine Nally la classe che gestire le sorgenti ordinate:

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 

Quindi, quest'ultima classe è chiamata in Ajax - dall'URL - quando si seleziona una sorgente. Ma come aggiornare il pulsante carica più da qui? Sono così perso.

Dopo aver letto la documentazione relativa all'impaginazione e alla vista di classe base, la mia conclusione sarebbe quella di eliminare quelle linee. Ma ho paura di rompere tutto e che non sarò in grado di farlo funzionare correttamente.

Quindi, la mia domanda è quale sarebbe il modo migliore di aggiornare un'impaginazione per l'ordinamento di alcune categorie di un oggetto?

Grazie in anticipo, almeno per il tempo speso per la mia richiesta.

risposta

3

Quindi, dato che era piuttosto complesso (ma alla fine non) ho riscritto tutto.

E ora funziona, tornando al buon vecchio giorno (cancella/codice di nuovo).

Grazie a tutte le persone che hanno trascorso del tempo leggendo la mia richiesta, anche se sfortunatamente nessuno ha potuto dare una risposta!