Уведомления

Группа в Telegram: @pythonsu

#1 Июль 22, 2016 19:08:51

AlexI
Зарегистрирован: 2016-07-22
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Упрощение views.py

Доброе время суток, формучане.
Не знаю в какую сторону копать. Рендерю странички функцией, например:

 def index(request):
  header = Header.objects.all()
  catalog = Catalog.objects.all()
  sub_catalog = SubCatalog.objects.all()
  indx_meta = IndxMeta.objects.last()
  #...etc.. выходит порядка 10-ка вызовов
  return render('index.html', {
    'header': header,
    'catalog': catalog,
    # ...etc... так же отправляется в ренде
    })

Из этого десятка примерно 2\3 однотипные и их приходится копипасить из вьюхи в вьюху. Это неудобно.
Я подумал и решил поступить просто (оказалось не все так просто, заодно буду благодарен за пояснения в матчасти) - я убрал все эти однотипные запросы в отдельный класс, который потом удобно добавляется одной строчкой в других вьюхах и тянут за собой весь длинный список типичных запросов. Вышло что-то типа:

Class BaseTpl:
header = Header.objects.all()
catalog = Catalog.objects.all()
sub_catalog = SubCatalog.objects.all()
indx_meta = IndxMeta.objects.last()

def index(request):
basetpl = BaseTpl()
news = News.objects.all()
page = Page.objects.all()
return render ('index.html', {
'basetpl': basetpl,
'news': news,
'page': page
})

Потом в форматировании шаблонов удобно работать с этим basetpl, т.к. к нему прикручены все нужные мне запросы.

Но такое упрощение, чтобы не забыть где-то в какую-нибудь вьюху добавить нужные запросы, столкнуло меня с проблемой - эти запросы не обновляются. Чтобы они обновились нужно перезагружать nginx.

Помогите разобраться, как вообще в django правильно организовать подобное?

Отредактировано AlexI (Июль 22, 2016 19:35:19)

Офлайн

#2 Июль 23, 2016 09:09:59

plusplus
От:
Зарегистрирован: 2009-01-05
Сообщения: 418
Репутация: +  15  -
Профиль   Отправить e-mail  

Упрощение views.py

Офлайн

#3 Июль 23, 2016 11:24:36

VadimK
Зарегистрирован: 2013-07-03
Сообщения: 199
Репутация: +  16  -
Профиль   Отправить e-mail  

Упрощение views.py

Я бы посмотрел в сторону создания своих тегов для темплейтов.
https://docs.djangoproject.com/en/1.9/howto/custom-template-tags/

Тогда просто в темплейте вставляете нужные теги, мол тут новости, а тут каталог, а тут вложенное еще что то. И не надо будет ничего дополнительно во views запрашивать.

Офлайн

#4 Авг. 4, 2016 11:35:32

Elaphe
Зарегистрирован: 2015-02-04
Сообщения: 125
Репутация: +  5  -
Профиль   Отправить e-mail  

Упрощение views.py

Но такое упрощение, чтобы не забыть где-то в какую-нибудь вьюху добавить нужные запросы, столкнуло меня с проблемой - эти запросы не обновляются. Чтобы они обновились нужно перезагружать nginx.
Потому что вместо
 Class BaseTpl:
  header = Header.objects.all()
  catalog = Catalog.objects.all()
  sub_catalog = SubCatalog.objects.all()
  indx_meta = IndxMeta.objects.last()
Надо сделать вот так:
 Class BaseTpl:
    def __init__(self):
      self.header = Header.objects.all()
      self.catalog = Catalog.objects.all()
      self.sub_catalog = SubCatalog.objects.all()
      self.indx_meta = IndxMeta.objects.last()
После этого все будет обновляться.
Так происходят потому, что запросы, сделанные просто в классе, относятся к классу, который инициализируется один раз - при создании класса.
А если они создаются в __init__, то они относятся к экзепляру класса, который каждый раз создается новый.

Отредактировано Elaphe (Авг. 4, 2016 11:38:27)

Офлайн

#5 Авг. 9, 2016 14:41:56

AlexI
Зарегистрирован: 2016-07-22
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Упрощение views.py

Elaphe, большое спасибо!

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version