Browse Source
Refactoring vedapp.views.devices view to ClassBasedView.
Refactoring vedapp.views.devices view to ClassBasedView.
Also add OrderingMixin for ordering. And update ordering template. Changed files in commit changed: README.md changed: devapp/templates/devapp/devices.html changed: devapp/urls.py changed: devapp/views.py changed: djing/global_base_views.py new file: docs/img/pagination.png new file: docs/views.md changed: mydefs.py new file: templates/toolbar_page_cbv.htmldevel
9 changed files with 148 additions and 29 deletions
-
1README.md
-
8devapp/templates/devapp/devices.html
-
2devapp/urls.py
-
49devapp/views.py
-
30djing/global_base_views.py
-
BINdocs/img/pagination.png
-
56docs/views.md
-
1mydefs.py
-
26templates/toolbar_page_cbv.html
|
After Width: 223 | Height: 68 | Size: 1.3 KiB |
@ -0,0 +1,56 @@ |
|||||
|
# Работа с представлениями |
||||
|
|
||||
|
При разработке представлений мне пришлось реализовать несколько алгоритмов, которых |
||||
|
нет в поставке Django. Они связаны с особенностями реализации системы. |
||||
|
|
||||
|
* [Пагинатор](#markdown-header-пагинатор) |
||||
|
* [Сортировка по полям объектов из списка](markdown-header-сортировка-по-полям-объектов-из-списка) |
||||
|
|
||||
|
|
||||
|
### Пагинатор |
||||
|
Есть реализованный шаблон для пагинации. При использовании [Class Based View](https://docs.djangoproject.com/en/1.11/topics/class-based-views/), |
||||
|
в шаблоне вы можете включить страницу *templates/toolbar_page_cbv.html*. |
||||
|
|
||||
|
Например вы создали клас представления: |
||||
|
|
||||
|
```python |
||||
|
from django.views.generic import ListView |
||||
|
|
||||
|
class PaysListView(ListView): |
||||
|
... |
||||
|
pass |
||||
|
|
||||
|
``` |
||||
|
|
||||
|
Тогда в шаблоне с bootstrap вы можете увидеть примерно такую пагинацию которую |
||||
|
вы конечно же можете изменить на свою. |
||||
|
. |
||||
|
|
||||
|
|
||||
|
### Сортировка по полям объектов из списка |
||||
|
Для того чтоб иметь возможность сортировать по полю объекта из списка, в шаблоне нужно передать |
||||
|
имя поля по которому нужна сортировка и направление сортировки. |
||||
|
|
||||
|
На примере *devapp/devices.html* можно рассмотреть такую сортировку. |
||||
|
Там указан url с параметрами |
||||
|
> {% url 'devapp:devs' group.pk %}?order_by=ip_address&dir={{ dir|default:'down' }} |
||||
|
|
||||
|
Тут обратная сортировка по полю *ip_address*, со знаком -. То есть эквивалент будет выглядеть примерно так: |
||||
|
> Device.objects.all().order_by('-ip_address') |
||||
|
|
||||
|
После того как вы отсортируете один раз, направление поменяется, в переменную dir будет передано |
||||
|
значение *up*, и сортировка пройдёт без знака - |
||||
|
|
||||
|
В то же время ваше представление нужно отнаследовать от OrderingMixin из *djing.global_base_views*. |
||||
|
Определение представления с сортировкой будет выглядеть так: |
||||
|
|
||||
|
```python |
||||
|
from django.views.generic import ListView |
||||
|
from djing.global_base_views import OrderingMixin |
||||
|
|
||||
|
class PaysListView(ListView, OrderingMixin): |
||||
|
... |
||||
|
pass |
||||
|
``` |
||||
|
|
||||
|
Примесь *OrderingMixin* добавляет в контекст переменные *order_by* и *dir* для использования в шалоне. |
||||
@ -0,0 +1,26 @@ |
|||||
|
{% if paginator.num_pages > 1 %} |
||||
|
{% load dpagination %} |
||||
|
<div class="row"> |
||||
|
<div class="col-sm-4 col-sm-offset-4"> |
||||
|
<ul class="pagination"> |
||||
|
{% if page_obj.number == 1 %} |
||||
|
<li class="disabled"><a href="#">«</a></li> |
||||
|
{% else %} |
||||
|
<li><a href="?{% url_page_replace request 'page' 1 %}">«</a></li> |
||||
|
{% endif %} |
||||
|
{% if page_obj.has_previous %} |
||||
|
<li><a href="?{% url_page_replace request 'page' page_obj.previous_page_number %}">{{ page_obj.previous_page_number }}</a></li> |
||||
|
{% endif %} |
||||
|
<li class="disabled"><a href="#">{{ page_obj.number }}</a></li> |
||||
|
{% if page_obj.has_next %} |
||||
|
<li><a href="?{% url_page_replace request 'page' page_obj.next_page_number %}">{{ page_obj.next_page_number }}</a></li> |
||||
|
{% endif %} |
||||
|
{% if page_obj.number == paginator.num_pages %} |
||||
|
<li class="disabled"><a href="#">»</a></li> |
||||
|
{% else %} |
||||
|
<li><a href="?{% url_page_replace request 'page' paginator.num_pages %}">»</a></li> |
||||
|
{% endif %} |
||||
|
</ul> |
||||
|
</div> |
||||
|
</div> |
||||
|
{% endif %} |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue