place search 2 fields

remotes/origin/1203
Nazar Kotyuk 12 years ago
parent e1b5ceba82
commit c7c1cc147b
  1. 9
      accounts/search_indexes.py
  2. 1
      city/management/__init__.py
  3. 1
      city/management/commands/__init__.py
  4. 8210
      city/management/commands/errors.txt
  5. 128
      city/management/commands/fill_city.py
  6. 129
      city/management/commands/fill_city_desc.py
  7. 12
      city/search_indexes.py
  8. 26
      core/forms.py
  9. 37
      core/views.py
  10. 37
      functions/forms.py
  11. 49
      import_xls/excel_settings.py
  12. 31
      import_xls/export_forms.py
  13. 9
      place_exposition/models.py
  14. 31
      place_exposition/search_indexes.py
  15. 1
      place_exposition/views.py
  16. 3
      proj/urls.py
  17. 2
      schema.xml
  18. 3
      templates/client/base_catalog.html
  19. 6
      templates/client/includes/catalog_search.html
  20. 59
      templates/client/includes/place/search_result.html
  21. 70
      templates/client/place/search.html
  22. 3
      templates/client/search/indexes/accounts/user_text.txt
  23. 1
      templates/client/search/indexes/city/city_text.txt
  24. 4
      templates/client/search/indexes/place_exposition/placeexposition_text.txt

@ -5,9 +5,16 @@ from models import User
class UserIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
first_name = indexes.CharField(model_attr='first_name')
last_name = indexes.CharField(model_attr='last_name')
email = indexes.NgramField(model_attr='email')
#email = indexes.CharField(model_attr='email')
def get_model(self):
return User
def index_queryset(self, using=None):
return self.get_model().objects.all()
return self.get_model().objects.filter(is_active=True)

@ -1 +0,0 @@
__author__ = 'kotzilla'

@ -1 +0,0 @@
__author__ = 'kotzilla'

File diff suppressed because it is too large Load Diff

@ -1,128 +0,0 @@
from django.core.management.base import BaseCommand, CommandError
import urllib2, base64, json
from country.models import Country
from city.models import City
from functions.form_check import translit_with_separator
import string, random
def random_url():
salt = 'randomurl-'
r = ''.join(random.choice(string.ascii_lowercase) for _ in range(8))
return salt+r
class Command(BaseCommand):
# booking data
b_username = 'expomap'
b_password = '33xp00m33p'
def fill_city(self, d):
lang = d['languagecode']
id = d['city_id']
country_code = d['countrycode']
name = d['name']
country = Country.objects.filter(country_code=country_code)[0]
try:
city = City.objects.get(id=id)
except City.DoesNotExist:
try:
url = translit_with_separator(name)+'-%s'%country_code
except:
url = random_url()
city = City(country=country, id=id, url=url)
city.translate(lang)
city.name = name
try:
city.save()
except Exception, e:
with open('/home/kotzilla/Documents/qwer/proj/city/management/commands/errors.txt', 'a') as f:
f.write('error: %s\n city: %s\n'%(str(e), str(d)))
return
try:
url = translit_with_separator(name)+'-%s'%country_code
except:
url = random_url()
city.url = url
try:
city.save()
except Exception, e:
with open('/home/kotzilla/Documents/qwer/proj/city/management/commands/errors.txt', 'a') as f:
f.write('error: %s\n city: %s\n'%(str(e), str(d)))
return
try:
tr = City._meta.translations_model.objects.get(language_code=lang,master__id=getattr(city, 'id'))
except:
city.translate(lang)
city.name = name
try:
city.save()
return
except Exception, e:
with open('/home/kotzilla/Documents/qwer/proj/city/management/commands/errors.txt', 'a') as f:
f.write('error: %s\n city: %s\n'%(str(e), str(d)))
return
tr.name = name
tr.save()
return
def handle(self, *args, **options):
ROWS = 1000
qs = Country.objects.filter()
codes = [country.country_code for country in qs]
#print(codes[86:])
for code in codes[86:]:# start from 7 cause previous already filled(delete this)
offset= 0
run = True
while(run):
url = 'https://distribution-xml.booking.com/json/bookings.getCities?countrycodes=%s&rows=%s&offset=%s&lanuagecodes=ru,en'%(code ,ROWS, offset)
request = urllib2.Request(url)
base64string = base64.encodestring('%s:%s' % (self.b_username, self.b_password)).replace('\n', '')
request.add_header("Authorization", "Basic %s" % base64string)
try:
response = urllib2.urlopen(request)
except urllib2.HTTPError, e:
continue
#raise CommandError('request failed. code error: %s'%code)
except urllib2.URLError, e:
continue
#raise CommandError('request failed. code error: %s'%code)
if response:
try:
json_list = response.read()
except Exception, e:
with open('/home/kotzilla/Documents/qwer/proj/city/management/commands/errors.txt', 'a') as f:
f.write('error: %s\n'%str(e))
continue
else:
with open('/home/kotzilla/Documents/qwer/proj/city/management/commands/errors.txt', 'a') as f:
f.write('error: bad request\n')
continue
try:
cities = json.loads(json_list)
except:
continue
for city in cities:
if isinstance(city, dict):
self.fill_city(city)
print('city: %s, country: %s, language: %s'%(city.get('name'), city.get('countrycode'), city.get('languagecode')))
if len(cities) < ROWS:
run = False
else:
offset += ROWS

@ -1,129 +0,0 @@
from django.core.management.base import BaseCommand, CommandError
import urllib2, base64, json
from country.models import Country
from city.models import City
from functions.form_check import translit_with_separator
import string, random
def random_url():
salt = 'randomurl-'
r = ''.join(random.choice(string.ascii_lowercase) for _ in range(8))
return salt+r
class Command(BaseCommand):
# booking data
b_username = 'expomap'
b_password = '33xp00m33p'
def fill_city(self, d):
lang = d['languagecode']
id = d['city_id']
country_code = d['countrycode']
name = d['name']
country = Country.objects.filter(country_code=country_code)[0]
try:
city = City.objects.get(id=id)
except City.DoesNotExist:
try:
url = translit_with_separator(name)+'-%s'%country_code
except:
url = random_url()
city = City(country=country, id=id, url=url)
city.translate(lang)
city.name = name
try:
city.save()
except Exception, e:
with open('/home/kotzilla/Documents/qwer/proj/city/management/commands/errors.txt', 'a') as f:
f.write('error: %s\n city: %s\n'%(str(e), str(d)))
return
try:
url = translit_with_separator(name)+'-%s'%country_code
except:
url = random_url()
city.url = url
try:
city.save()
except Exception, e:
with open('/home/kotzilla/Documents/qwer/proj/city/management/commands/errors.txt', 'a') as f:
f.write('error: %s\n city: %s\n'%(str(e), str(d)))
return
try:
tr = City._meta.translations_model.objects.get(language_code=lang,master__id=getattr(city, 'id'))
except:
city.translate(lang)
city.name = name
try:
city.save()
return
except Exception, e:
with open('/home/kotzilla/Documents/qwer/proj/city/management/commands/errors.txt', 'a') as f:
f.write('error: %s\n city: %s\n'%(str(e), str(d)))
return
tr.name = name
tr.save()
return
def handle(self, *args, **options):
ROWS = 1000
qs = Country.objects.filter()
codes = [country.country_code for country in qs]
#print(sorted(codes, reverse=True))
for code in sorted(codes, reverse=True):
offset= 0
run = True
while(run):
url = 'https://distribution-xml.booking.com/json/bookings.getCities?countrycodes=%s&rows=%s&offset=%s&lanuagecodes=ru,en'%(code ,ROWS, offset)
request = urllib2.Request(url)
base64string = base64.encodestring('%s:%s' % (self.b_username, self.b_password)).replace('\n', '')
request.add_header("Authorization", "Basic %s" % base64string)
try:
response = urllib2.urlopen(request)
except urllib2.HTTPError, e:
continue
#raise CommandError('request failed. code error: %s'%code)
except urllib2.URLError, e:
continue
#raise CommandError('request failed. code error: %s'%code)
if response:
try:
json_list = response.read()
except Exception, e:
with open('/home/kotzilla/Documents/qwer/proj/city/management/commands/errors.txt', 'a') as f:
f.write('error: %s\n'%str(e))
continue
else:
with open('/home/kotzilla/Documents/qwer/proj/city/management/commands/errors.txt', 'a') as f:
f.write('error: bad request\n')
continue
try:
cities = json.loads(json_list)
except:
continue
for city in cities:
if isinstance(city, dict):
self.fill_city(city)
print('city: %s, country: %s, language: %s'%(city.get('name'), city.get('countrycode'), city.get('languagecode')))
if len(cities) < ROWS:
run = False
else:
offset += ROWS

@ -1,12 +1,18 @@
from haystack import indexes
from models import City
"""
class CityIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True)
name = indexes.CharField(model_attr='name')
text = indexes.CharField(document=True, use_template=True)
translations = indexes.MultiValueField()
#name = indexes.CharField(model_attr='translations__name')
def prepare_translations(self, obj):
return [tr.name for tr in obj.translations.all()]
def get_model(self):
return City
def index_queryset(self, using=None):
return self.get_model().objects.all()
return self.get_model().objects.filter()
"""

@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
from django import forms
from place_exposition.models import PlaceExposition
from place_conference.models import PlaceConference
from django.utils.translation import ugettext_lazy as _
from haystack.query import SearchQuerySet, EmptySearchQuerySet
class PlaceSearchForm(forms.Form):
q = forms.CharField(label=_(u'Поиск'), required=False)
w = forms.CharField(label=_(u'Где'), required=False)
def search(self):
q = self.cleaned_data.get('q')
w = self.cleaned_data.get('w')
if not q and not w:
return EmptySearchQuerySet()
sqs = SearchQuerySet().models(PlaceExposition, PlaceConference)
if q:
sqs = sqs.auto_query(q)
if w:
sqs = sqs.filter(where__contains=w)
return sqs

@ -1,15 +1,43 @@
# -*- coding: utf-8 -*-
from django.shortcuts import render_to_response
from country.models import Country
from city.models import City
from place_exposition.models import PlaceExposition
from place_conference.models import PlaceConference
from django.views.generic import ListView
from django.views.generic import ListView, FormView
from functions.views_help import split_params
from django.utils.translation import ugettext as _
from django.http import HttpResponse
from forms import PlaceSearchForm
class PlaceSearchView(ListView):
paginate_by = 2
template_name = 'place/search.html'
model = PlaceExposition
search_form = PlaceSearchForm
def get_queryset(self):
if self.request.GET:
form = self.search_form(self.request.GET)
if form.is_valid():
return form.search()
else:
return []
else:
return []
def get_context_data(self, **kwargs):
context = super(PlaceSearchView, self).get_context_data(**kwargs)
context['search_form'] = PlaceSearchForm(self.request.GET)
queries = self.request.GET.copy()
if queries.has_key('page'):
del queries['page']
context['queries'] = queries
context['search_action'] = '/places/search/'
return context
class PlaceListView(ListView):
@ -18,6 +46,7 @@ class PlaceListView(ListView):
single_page = False
template_name = 'place_catalog_test.html'
model = 'places'
search_form = PlaceSearchForm
def get_params(self):
model_names = {'places': _(u'Места')}
@ -77,6 +106,8 @@ class PlaceListView(ListView):
context = super(PlaceListView, self).get_context_data(**kwargs)
context['filter'] = self.params
context['single_page'] = self.single_page
context['search_form'] = self.search_form
context['search_action'] = '/places/search/'
return context
class PlacePhotoView(PlaceListView):

@ -3,6 +3,8 @@ from django import forms
from django.utils.translation import ugettext_lazy as _
from theme.models import Theme
from haystack.query import SearchQuerySet
class AdminSearchForm(forms.Form):
search_name = forms.CharField(required=False, max_length=50)
@ -16,3 +18,38 @@ class ThemeSearch(forms.Form):
widget=forms.CheckboxSelectMultiple)
class AbstractSearch(forms.Form):
q = forms.CharField(label=_(u'Поиск'), required=False)
w = forms.CharField(label=_(u'Где'), required=False)
model = None
def search(self):
if not self.is_valid():
return []
q = self.cleaned_data.get('q')
w = self.cleaned_data.get('w')
if not q and not w:
return []
sqs = SearchQuerySet().models(self.model)
if q:
sqs = sqs.auto_query(q)
if w:
sqs = sqs.filter(where__contains=w)
return sqs
#sqs = SearchQuerySet().models(self.model).auto_query(self.cleaned_data.get('q'))
#return sqs
from place_exposition.models import PlaceExposition
from place_exposition.models import EXPOSITION_TYPE
class SearchPlaceExpositionForm(AbstractSearch):
model = PlaceExposition
type = forms.ChoiceField(choices=EXPOSITION_TYPE, required=False)

@ -8,7 +8,7 @@ from hvad.utils import get_translation_aware_manager
def get_bool(value):
if value:
return 1
return 0
return ''
def get_int(value):
if not value:
@ -46,17 +46,56 @@ def get_tag(tag, theme):
result += '['+','.join(tag_list)+']'
return result
from place_exposition.models import EXPOSITION_TYPE
def get_place_type():
pass
def get_place_type(value):
for t in EXPOSITION_TYPE:
if value == t[0]:
return t[1]
return t[0][1]
place_settings=[
{'name': 'id', 'verbose_name': u'id', 'type': get_int, 'width':1500},
{'name': 'name', 'verbose_name': u'Название', 'type': unicode},
{'name': 'type', 'verbose_name': u'Тип', 'type': get_place_type},##########
{'name': 'main_title', 'verbose_name': u'Краткое описание', 'type': unicode},
{'name': 'country', 'verbose_name': u'Страна', 'type': unicode},
{'name': 'city', 'verbose_name': u'Город', 'type': unicode},
{'name': 'address', 'verbose_name': u'Адресс', 'type': unicode},
{'name': 'phone', 'verbose_name': u'Тел.', 'type': get_int},
{'name': 'fax', 'verbose_name': u'Факс', 'type': get_int},
{'name': 'web_page', 'verbose_name': u'Веб-сайт', 'type': unicode},
{'name': 'email', 'verbose_name': u'Email', 'type': unicode},
{'name': 'virtual_tour', 'verbose_name': u'Виртуальный тур', 'type': unicode},
{'name': 'virtual_tour', 'verbose_name': u'Виртуальный тур', 'type': unicode},
{'name': 'foundation_year', 'verbose_name': u'Год основания', 'type': get_int},
{'name': 'event_in_year', 'verbose_name': u'Количество мероприятий в год', 'type': get_int},
{'name': 'total_area', 'verbose_name': u'Общая выставочная площадь, кв. м.', 'type': get_int},
{'name': 'closed_area', 'verbose_name': u'Закрытая выставочная площадь, кв. м.', 'type': get_int},
{'name': 'open_area', 'verbose_name': u'Открытая выставочная площадь, кв. м.', 'type': get_int},
{'name': 'total_pavilions', 'verbose_name': u'Количество павильонов', 'type': get_int},
{'name': 'total_halls', 'verbose_name': u'Конференц-залы', 'type': get_int},
{'name': 'bank', 'verbose_name': u'Банк/Банкоматы/Обмен валюты', 'type': get_bool},
{'name': 'children_room', 'verbose_name': u'Детская комната', 'type': get_bool},
{'name': 'disabled_service', 'verbose_name': u'Сервис для людей с ограниченными физическими возможностями', 'type': get_bool},
{'name': 'conference_centre', 'verbose_name': u'Конгресс-центр', 'type': get_bool},
{'name': 'business_centre', 'verbose_name': u'Бизнес-центр', 'type': get_bool},
{'name': 'online_registration', 'verbose_name': u'On-line регистрация', 'type': get_bool},
{'name': 'wifi', 'verbose_name': u'Wi-Fi', 'type': get_bool},
{'name': 'cafe', 'verbose_name': u'Кафе и рестораны', 'type': get_bool},
{'name': 'terminals', 'verbose_name': u'Информационные терминалы', 'type': get_bool},
{'name': 'parking', 'verbose_name': u'Парковка', 'type': get_bool},
{'name': 'press_centre', 'verbose_name': u'Пресс-центр', 'type': get_bool},
{'name': 'mobile_application', 'verbose_name': u'Мобильное приложение', 'type': get_bool},
]
field_settings = [
{'name': 'id', 'verbose_name': u'id', 'type': get_int, 'width':1500},
{'name': 'url', 'verbose_name': u'url', 'type': unicode},
{'name': 'name', 'verbose_name': u'Имя', 'type': unicode},
{'name': 'type', 'verbose_name': u'Тип', 'type': get_place_type, 'width':8000},
{'name': 'name', 'verbose_name': u'Название', 'type': unicode},
#{'name': 'type', 'verbose_name': u'Тип', 'type': get_place_type, 'width':8000},
{'name': 'data_begin', 'verbose_name': u'Дата начала', 'type': unicode},
{'name': 'data_end', 'verbose_name': u'Дата окончания', 'type': unicode},
{'name': 'audience', 'verbose_name': u'Аудитория', 'type': get_audience},

@ -100,8 +100,39 @@ class ExportTagForm(ExportForm):
def get_fname(self):
return 'tags.xls'
from excel_settings import place_settings
class ExportPlaceExpositionForm(ExportForm):
model = PlaceExposition
def export(self):
data = self.cleaned_data
objects = self.get_objects(data)
if not objects:
# not found any objects
return None
for row, object in enumerate(objects):
# column number
col = 0
for field in place_settings:
try:
value = getattr(object, field['name'])
except AttributeError:
# doesnt have such field. exit from iteration
continue
if row == 0:
# first iteration. set names. set columns width
self.worksheet.write(0, col, field.get('verbose_name', 'default'), self.style)
#self.worksheet.write(1, col, field.get('name'), self.style)
self.worksheet.col(col).width = field.get('width', 3333)
if field['name']=='tag':
self.worksheet.write(row+1, col, field.get('type')(value, object.theme))
else:
self.worksheet.write(row+1, col, field.get('type')(value))
col += 1
return self.workbook
def get_fname(self):
return 'places.xls'

@ -89,6 +89,11 @@ class PlaceExposition(TranslatableModel):
class Meta:
ordering = ['translations__name']
def get_index_text(self):
names = [tr.name for tr in self.translations.all()]
return names
def __unicode__(self):
return self.lazy_translation_getter('name', unicode(self.pk))
@ -116,9 +121,7 @@ class PlaceExposition(TranslatableModel):
def get_scheme(self):
scheme = self.files.filter(purpose='scheme teritory')
return scheme
if scheme:
return scheme[0]
return scheme
def events(self):
events = Exposition.objects.filter(place=self)[:6]

@ -0,0 +1,31 @@
from haystack import indexes
from models import PlaceExposition
from django.conf import settings
class PlaceExpositionIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
where = indexes.MultiValueField()
def prepare_where(self, obj):
country = [tr.name for tr in obj.country.translations.all()]
city = [tr.name for tr in obj.city.translations.all()]
return country + city
"""
translations = indexes.MultiValueField()
def prepare_translations(self, obj):
return [tr.name for tr in obj.translations.all()]
"""
def get_model(self):
return PlaceExposition
def index_queryset(self, using=None):
return self.get_model().objects.filter()

@ -2,6 +2,7 @@
from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect, HttpResponse
from django.template import RequestContext
from django.core.context_processors import csrf
from django.http import Http404
from django.shortcuts import get_object_or_404
#models

@ -2,7 +2,7 @@
from django.conf.urls import patterns, include, url
from views import AdvertisingView
from core.views import PlaceListView, PlacePhotoView
from core.views import PlaceListView, PlacePhotoView, PlaceSearchView
from views import MainPageView
@ -22,6 +22,7 @@ urlpatterns = patterns('',
url(r'^messages/', include('django_messages.urls')),
url(r'^advertising/$', AdvertisingView.as_view()),
url(r'^places/search/$', PlaceSearchView.as_view()),
url(r'^places/(?P<params>.*)/photo/$', PlacePhotoView.as_view()),
url(r'^places/(?P<params>.*)/(?P<page>\d+)/$', PlaceListView.as_view()),
url(r'^places/(?P<page>\d+)/$', PlaceListView.as_view()),

@ -150,6 +150,8 @@
<field name="first_name" type="text_en" indexed="true" stored="true" multiValued="false" />
<field name="last_name" type="text_en" indexed="true" stored="true" multiValued="false" />
</fields>
<!-- field to use to determine and enforce document uniqueness. -->

@ -52,7 +52,10 @@
</aside>
<div class="mcl">
{% with search_form=search_form search_action=search_action%}
{% include 'client/includes/catalog_search.html' %}
{% endwith %}
{% block bread_scrumbs %}
{% with filter=filter %}

@ -2,20 +2,20 @@
{% load i18n %}
<div class="in-search-form">
<form action="#">
<form action="{{ search_action }}">
<div class="s-title">{% trans 'поиск событий' %}</div>
<div class="search-form-wrap">
<div class="search-line">
<div class="sf-field-wrap">
<div class="sf-field">
<label for="search">{% trans 'Я ищу:' %}</label>
<div class="input-text"><input type="text" class="autocomplete" id="search" name="query" /></div>
<div class="input-text">{{ search_form.q }}</div>
</div>
</div>
<div class="sf-field-wrap">
<div class="sf-field">
<label for="where">{% trans 'Где:' %}</label>
<div class="input-text"><input type="text" class="autocomplete" id="where" name="where" /></div>
<div class="input-text">{{ search_form.w }}</div>
</div>
</div>
<div class="sf-field-wrap">

@ -0,0 +1,59 @@
{% load static %}
{% load i18n %}
{% load template_filters %}
<ul class="cat-list cl-places">
{% for result in query %}
<li class="cl-item">
<div class="cl-item-wrap clearfix">
<a href="/{{ result.object.get_permanent_url }}">
<div class="cli-pict">
{% with obj=result.object %}
{% include 'client/includes/show_logo.html' %}
{% endwith %}
</div>
</a>
<div class="cli-info">
<div class="cli-top clearfix">
<div class="cli-approved">
{% if result.object.approved %}
<img src="{% static 'clint/img/approved-logo.png' %}" alt="" title="Approved Event" />
{% endif %}
</div>
<header>
<div class="cli-title"><a href="{{ result.object.get_permanent_url }}">
{{ result.object.name|safe }}</a></div>
</header>
<div class="cli-descr">{{ result.object.get_type }}</div>
</div>
<div class="cli-bot clearfix">
{% if result.object.total_area %}
<div class="cli-dim">{{ result.object.total_area }} м2</div>
{% endif %}
<div class="cli-place"><a href="#">{{ result.object.country }}</a>, <a href="#">{{ result.object.city }}</a>, <a href="{{ result.object.get_permanent_url }}">{{ result.object.adress }}</a></div>
</div>
</div>
<div class="cli-buttons clearfix">
<div class="cli-m-buttons">
<a class="button icon-info" href="{{ result.object.get_permanent_url }}">{% trans 'описание' %}</a>
{% if result.object.get_events_number %}
<a class="button green icon-list" href="#">{% trans 'события' %} ({{ result.object.get_events_number }})</a>
{% endif %}
{% if result.object.get_photos %}
<a class="button blue icon-photo" href="{{ result.object.get_permanent_url }}/photo/">{% trans 'фото' %}</a>
{% endif %}
</div>
<!--
<div class="cli-s-buttons">
<a class="button blue2 lc" href="#">{% trans 'Найти отели поблизости' %}</a>
</div>
-->
</div>
</div>
</li>
{% endfor %}
</ul>

@ -0,0 +1,70 @@
{% extends 'base_catalog.html' %}
{% load i18n %}
{% load template_filters %}
{% block bread_scrumbs %}
<div class="bread-crumbs">
<a href="/">{% trans 'Главная страница' %}</a>
<a href="/places/">{% trans 'Места' %}</a>
<strong>{% trans 'Поиск' %}</strong>
</div>
{% endblock %}
{% block page_title %}
<div class="page-title">
<h1>{% trans 'Поиск' %}:</h1>
</div>
{% endblock %}
{% block content_list %}
{% with query=object_list %}
{% include 'includes/place/search_result.html' %}
{% endwith %}
{% endblock %}
{% block paginator %}
{% if page_obj.paginator.num_pages > 1 %}
<div class="pagination clearfix">
<div class="pg-info"> Показано {{ page_obj.start_index }} - {{ page_obj.end_index }} <i>(всего {{ page_obj.paginator.count }} позиций)</i></div>
<div class="pg-body">
{% if page_obj.has_previous %}
<a class="pg-prev" href="?page={{ page_obj.previous_page_number }}&{{ queries.urlencode }}">Предыдущая</a>
{% else %}
<a class="pg-prev disabled" href="#">Предыдущая</a>
{% endif %}
<ul>
{% if page_obj.number > 2 %}
<li><a href="?page={{ 1 }}&{{ queries.urlencode }} ">{{ 1 }}</a></li>
{% if page_obj.number > 3 %}
<li>...</li>
{% endif %}
{% endif %}
{% if page_obj.has_previous %}
<li><a href="?page={{ page_obj.previous_page_number }}&{{ queries.urlencode }}">{{ page_obj.previous_page_number }}</a></li>
{% endif %}
<li><b>{{ page_obj.number }}</b></li>
{% if page_obj.has_next %}
<li><a href="?page={{ page_obj.next_page_number }}&{{ queries.urlencode }}">{{ page_obj.next_page_number }}</a></li>
{% endif %}
{% if page_obj.paginator.num_pages|subtract:page_obj.number > 1 %}
{% if page_obj.paginator.num_pages|subtract:page_obj.number > 2 %}
<li>...</li>
{% endif %}
<li><a href="?page={{ page_obj.paginator.num_pages }}&{{ queries.urlencode }}">{{ page_obj.paginator.num_pages }}</a></li>
{% endif %}
</ul>
{% if page_obj.has_next %}
<a class="pg-next" href="?page={{ page_obj.next_page_number }}&{{ queries.urlencode }}">Следующая</a>
{% else %}
<a class="pg-next disabled" href="#">Следующая</a>
{% endif %}
</div>
</div>
{% endif %}
{% endblock %}

@ -0,0 +1,3 @@
{{ object.first_name }}
{{ object.last_name }}
{{ object.email }}

@ -0,0 +1,4 @@
{% for text in object.get_index_text %}
{{ text }}
{% endfor %}
Loading…
Cancel
Save