Das Problem ist ein bisschen komplex. In der Tat, ich versuche nicht, das Rad neu zu erfinden und seit dem Back-End-Dev links versuche ich mein Bestes, um seinen Code nicht zu zerstören.Django views.py Aktualisierung einer Seitennumerierung aus einer Kategorieauswahl in einer klassenbasierten Ansicht
Aber ich denke, diesmal muss ich eine Menge Dinge ändern. Oder vielleicht ist die Antwort ziemlich einfach und mein See der Erfahrung spielt gegen mich.
Grundsätzlich habe ich eine Liste von Artikeln, die Sie nach Kategorien sortieren können.
ich die auf diese Weise in den URLs sortiert:
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'),
)
und die Haupt-URL ist mydomain.com/en/press/
Also im Grunde, wenn ich versuche, durch Quellen meine Artikel zu sortieren, zum Beispiel, ich habe meinen Artikel durch diese Kategorie anzeigen. Aber die Paginierung hat immer noch den ganzen Artikel.
Also, wenn es nur einen Artikel in der Kategorie gibt, wird dieser einzige Artikel angezeigt, aber mein "loadMore Button" ist nicht deaktiviert, da es in Betracht zieht, dass es mehr Artikel gibt.
Hier sind die Prinzipien views.py Basisklassenansicht, zuerst die Basis:
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)
und die allgemeinen Listeneintrag Ansicht:
#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
Und man kann sehen, dass die loadmore Taste Aktualisierung auf dieser Linie:
context['load_more_url'] = self.get_load_more_url(request, context)
Ende FI Nally die Klasse, die die sortierten Quellen verwalten:
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
Also, diese letzte Klasse Aufruf in Ajax - von der URL - wenn Sie eine Quelle auswählen. Aber wie aktualisiert man den Lade mehr Button von hier? Ich bin so verloren.
Nach dem Lesen der Dokumentation über Paginierung und Basisklasse-Ansicht, meine Schlussfolgerung wäre, diese Zeile zu löschen. Aber ich habe Angst, alles zu brechen, und ich werde es nicht richtig funktionieren lassen können.
Also, meine Frage ist Was wäre die beste Möglichkeit zum Aktualisieren einer Seitennummerierung für die Sortierung nach einigen Kategorien ein Objekt?
Vielen Dank im Voraus, zumindest für die Zeit auf meine Anfrage verbracht.