1461: Этап №5: Фильтрация событий

реализовал ответ на аякс запрос (включает список елементов и пагинатор)
remotes/origin/stage5
Alexander Burdeiny 10 years ago
parent d1ffe23ea2
commit 94f80ee858
  1. 6
      events/common.py
  2. 16
      events/forms.py
  3. 5
      events/views.py
  4. 25
      templates/client/events/filter_listview_ajax.html

@ -40,12 +40,6 @@ def get_choices_kwargs(mapping):
MEMBERS = EnumChoices(**get_choices_kwargs(members_mapping))
VISITORS = EnumChoices(**get_choices_kwargs(visitors_mapping))
PRICE = EnumChoices(**get_choices_kwargs(price_mapping))
# N200=(1, _(u'до 200')),
# N200500=(2, _(u'200-500')),
# N5001000=(3, _(u'500-1000')),
# N10002000=(4, _(u'1000-2000')),
# N2000=(5, _(u'более 2000')),
# )
class ExtraWhere(object):

@ -235,7 +235,7 @@ class FilterForm(forms.Form):
return qs
def recalculate_choices(self):
print(self._is_valid)
# print(self._is_valid)
# if self._is_valid and self.lookup_kwargs:
for field in ['theme', 'tag', 'city', 'country']:
@ -265,7 +265,7 @@ class FilterForm(forms.Form):
qs.query.having.add(ExtraWhere(having, [], OR), AND)
qs = qs.values(*values).order_by(*order_by)
self.fields[field].queryset = qs
print(self.fields[field].queryset.query)
# print(self.fields[field].queryset.query)
for field in ['members', 'visitors', 'price']:
self.fields[field].choices = self.make_local_field_count(field) or self.fields[field].choices
@ -368,16 +368,22 @@ class FilterForm(forms.Form):
selects.append(select + ''.join(joins) + ' where ' + ' and '.join(where) + group_by)
sql = ' union '.join(selects)
print(sql)
# print(sql)
choices = []
if sql:
with connection.cursor() as c:
c = connection.cursor()
try:
c.execute(sql)
mapper = namedtuple('Result', [col[0] for col in c.description])
data = [mapper(*raw) for raw in c.fetchall()]
for key, val in _values_mapping:
count = sum([getattr(x, key, 0) or 0 for x in data])
choices.append((val.get('value'), val.get('label') + ' <i>({count})</i>'.format(count=count)))
finally:
c.close()
# some bug with these!
# AttributeError: __exit__
# with connection.cursor() as c:
return choices
def make_default_where(self, **kwargs):
@ -388,7 +394,7 @@ class FilterForm(forms.Form):
selects = []
case = None
count = None
print('looking {} {}'.format(field, self.lookup_kwargs))
# print('looking {} {}'.format(field, self.lookup_kwargs))
for model in self.models:
_field, _model, direct, m2m = model._meta.get_field_by_name(field)
joins = []

@ -16,7 +16,8 @@ class FilterListView(ContextMixin, FormMixin, ListView):
initial_ctx = {'filtering': True}
form_class = FilterForm
paginate_by = settings.CLIENT_PAGINATION
template_name = 'events/filter_listview.html'
_template_name = 'events/filter_listview.html'
_template_name_ajax = 'events/filter_listview_ajax.html'
def get_form_kwargs(self):
kwargs = super(FilterListView, self).get_form_kwargs()
@ -34,6 +35,8 @@ class FilterListView(ContextMixin, FormMixin, ListView):
def get(self, request, *args, **kwargs):
self.form = self.get_form(self.get_form_class())
self.extra_ctx['form'] = self.form
# ajax or get
self.template_name = self._template_name_ajax if request.is_ajax() else self._template_name
return super(FilterListView, self).get(request, *args, **kwargs)
def post(self, request, *args, **kwargs):

@ -0,0 +1,25 @@
{% load i18n %}
{% load template_filters %}
{% block content_list %}
{% with query=object_list %}
{% if query %}
{% include 'client/includes/events/filter_result.html' %}
{% else %}
<p class="message-not-found">
<span>
<i class="fa fa-exclamation-triangle"></i>
</span>
<span class="message">
{% trans "Увы, событий, соответствующих выбранным фильтрам, нет в каталоге.<br> Попробуйте укрупнить параметры фильтрации" %}
</span>
</p>
{% endif %}
{% endwith %}
{% endblock %}
{% block paginator %}
{% with page_obj=page_obj queries=queries %}
{% include 'client/includes/search_paginator.html' %}
{% endwith %}
{% endblock %}
Loading…
Cancel
Save