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.