Wiki » История » Версия 3
Dmitry Chernyak, 17.02.2021 17:08
| 1 | 1 | Dmitry Chernyak | h1. Django-gentelella |
|---|---|---|---|
| 2 | 1 | Dmitry Chernyak | |
| 3 | 3 | Dmitry Chernyak | *Django Gentelella* - это интерфейс для применения темы Gentelella https://colorlib.com/polygon/gentelella/ на проекты, написанные на основе фреймворка Django. |
| 4 | 3 | Dmitry Chernyak | Интерфейс состоит из собственных форм, базовых шаблонов страниц, к которым применена тема Gentelella, а также содержит набор кастомных элементов страниц (таблицы, модальные формы, элементы рендера и прочее). |
| 5 | 1 | Dmitry Chernyak | |
| 6 | 1 | Dmitry Chernyak | h2. Установка |
| 7 | 1 | Dmitry Chernyak | |
| 8 | 1 | Dmitry Chernyak | Для установки пакета необходимо склонировать репозиторий в директорию проекта |
| 9 | 1 | Dmitry Chernyak | |
| 10 | 1 | Dmitry Chernyak | <pre> |
| 11 | 2 | Dmitry Chernyak | git clone git://dev.skycover.ru:/django_gentelella.git |
| 12 | 1 | Dmitry Chernyak | </pre> |
| 13 | 1 | Dmitry Chernyak | |
| 14 | 1 | Dmitry Chernyak | добавить django_gentelella в список установленных приложений в @settings.py@ |
| 15 | 1 | Dmitry Chernyak | |
| 16 | 1 | Dmitry Chernyak | <pre> |
| 17 | 1 | Dmitry Chernyak | <...> |
| 18 | 1 | Dmitry Chernyak | INSTALLED_APPS = [ |
| 19 | 1 | Dmitry Chernyak | 'django.contrib.admin', |
| 20 | 1 | Dmitry Chernyak | <...>, |
| 21 | 1 | Dmitry Chernyak | 'django_gentelella', |
| 22 | 1 | Dmitry Chernyak | ] |
| 23 | 1 | Dmitry Chernyak | <...> |
| 24 | 1 | Dmitry Chernyak | </pre> |
| 25 | 1 | Dmitry Chernyak | |
| 26 | 1 | Dmitry Chernyak | h2. Использование |
| 27 | 1 | Dmitry Chernyak | |
| 28 | 1 | Dmitry Chernyak | Для использования темы Gentelella в шаблонах следует встраивать их в базовый: |
| 29 | 1 | Dmitry Chernyak | |
| 30 | 1 | Dmitry Chernyak | <pre> |
| 31 | 1 | Dmitry Chernyak | {% extends 'django_gentelella/templates/base.html' %} |
| 32 | 1 | Dmitry Chernyak | </pre> |
| 33 | 1 | Dmitry Chernyak | |
| 34 | 1 | Dmitry Chernyak | Для использования компонентов необходимо импортировать django_gentelella в шаблон: |
| 35 | 1 | Dmitry Chernyak | |
| 36 | 1 | Dmitry Chernyak | <pre> |
| 37 | 1 | Dmitry Chernyak | {% load django_gentelella %} |
| 38 | 1 | Dmitry Chernyak | </pre> |
| 39 | 1 | Dmitry Chernyak | |
| 40 | 1 | Dmitry Chernyak | h2. Компоненты |
| 41 | 1 | Dmitry Chernyak | |
| 42 | 1 | Dmitry Chernyak | h3. Модели |
| 43 | 1 | Dmitry Chernyak | |
| 44 | 1 | Dmitry Chernyak | *IntervalField* — поле для хранения интервалов дат в форме количества секунд. Наследуется от BigInt, в качестве аргументов может принимать verbose_name, минимальное и максимальное значение, формат. |
| 45 | 1 | Dmitry Chernyak | |
| 46 | 1 | Dmitry Chernyak | h3. Формы |
| 47 | 1 | Dmitry Chernyak | |
| 48 | 1 | Dmitry Chernyak | *ModelForm* - заменяет используемые поля форм Django на соответствующие поля Django Gentelella |
| 49 | 1 | Dmitry Chernyak | *Form* - оформляет используемые поля как form-control |
| 50 | 1 | Dmitry Chernyak | *ROFormMixin* - миксин для установки статуса Read Only для полей. В качестве аргументов получает: |
| 51 | 1 | Dmitry Chernyak | ## *read_only* - список полей для установки на них статуса |
| 52 | 1 | Dmitry Chernyak | ## *read_only_exclude* - список полей, для которых статус устанавливать не надо (в случае, если read_only == '__all__') |
| 53 | 1 | Dmitry Chernyak | |
| 54 | 1 | Dmitry Chernyak | *IntervalFormField* - поле для указания интервала времени в определённое количество часов, минут и секунд. |
| 55 | 1 | Dmitry Chernyak | *IntervalWidget* - виджет для поля указания интервала. |
| 56 | 1 | Dmitry Chernyak | !intfield.png! |
| 57 | 1 | Dmitry Chernyak | |
| 58 | 1 | Dmitry Chernyak | *Select2* - виджет для оформления полей выбора элемента из множества. |
| 59 | 1 | Dmitry Chernyak | !chfield.png! |
| 60 | 1 | Dmitry Chernyak | |
| 61 | 1 | Dmitry Chernyak | *Select2Multiple* - виджет для оформления полей множественного выбора. |
| 62 | 1 | Dmitry Chernyak | !multiselect.png! |
| 63 | 1 | Dmitry Chernyak | |
| 64 | 1 | Dmitry Chernyak | *CheckBox* - виджет для оформления поля выбора как группы кнопок. |
| 65 | 1 | Dmitry Chernyak | !check.png! |
| 66 | 1 | Dmitry Chernyak | |
| 67 | 1 | Dmitry Chernyak | Также предоставлены собственные замены для стандартных виджетов: |
| 68 | 1 | Dmitry Chernyak | |
| 69 | 1 | Dmitry Chernyak | |_. Виджет Django |_. Виджет DG | |
| 70 | 1 | Dmitry Chernyak | | NumberInput | IntegerInput | |
| 71 | 1 | Dmitry Chernyak | | TextInput | TextInput | |
| 72 | 1 | Dmitry Chernyak | | Textarea | TextArea | |
| 73 | 1 | Dmitry Chernyak | | Select | Select2 | |
| 74 | 1 | Dmitry Chernyak | | SelectMultiple | Select2Multiple | |
| 75 | 1 | Dmitry Chernyak | | DateTimeInput | DateTime | |
| 76 | 1 | Dmitry Chernyak | | DateInput | Date | |
| 77 | 1 | Dmitry Chernyak | | TimeInput | TimeInput | |
| 78 | 1 | Dmitry Chernyak | | CheckboxInput | SwitheryInput | |
| 79 | 1 | Dmitry Chernyak | |
| 80 | 1 | Dmitry Chernyak | *Пример использования компонентов Django Gentelella в формах* |
| 81 | 1 | Dmitry Chernyak | |
| 82 | 1 | Dmitry Chernyak | <pre> |
| 83 | 1 | Dmitry Chernyak | from django import forms |
| 84 | 1 | Dmitry Chernyak | from django_gentelella.forms import Select2, Select2Multiple, Form, DateTimeRangeField, DateTimeRangeWidget, IntervalFormField, SwitheryInput, CheckBox, Form, Date |
| 85 | 1 | Dmitry Chernyak | |
| 86 | 1 | Dmitry Chernyak | class TestForm(Form): |
| 87 | 1 | Dmitry Chernyak | choices = ( |
| 88 | 1 | Dmitry Chernyak | ('spam', 'Spam'), |
| 89 | 1 | Dmitry Chernyak | ('eggs', 'Eggs'), |
| 90 | 1 | Dmitry Chernyak | ('spanish_inquisition', 'Spanish Inquisition'), |
| 91 | 1 | Dmitry Chernyak | ) |
| 92 | 1 | Dmitry Chernyak | interval = IntervalFormField(label='Interval field', required=False) |
| 93 | 1 | Dmitry Chernyak | choice = forms.ChoiceField(label='Choice field', choices=choices, widget=Select2, required=False) |
| 94 | 1 | Dmitry Chernyak | multiselect = forms.MultipleChoiceField(label='Multiple choices', choices=choices, widget=Select2Multiple, required=False) |
| 95 | 1 | Dmitry Chernyak | swithery = forms.BooleanField(label='Swithery input', widget=SwitheryInput, required=False) |
| 96 | 1 | Dmitry Chernyak | radiobox = forms.ChoiceField(label='Checkboxes', choices=choices, widget=CheckBox, required=False) |
| 97 | 1 | Dmitry Chernyak | date = forms.DateField(label='Date', widget=Date) |
| 98 | 1 | Dmitry Chernyak | </pre> |
| 99 | 1 | Dmitry Chernyak | |
| 100 | 1 | Dmitry Chernyak | h3. Виды |
| 101 | 1 | Dmitry Chernyak | |
| 102 | 1 | Dmitry Chernyak | *BaseView* - базовый вид, от которого необходимо наследовать прочие виды проекта. |
| 103 | 1 | Dmitry Chernyak | |
| 104 | 1 | Dmitry Chernyak | Переменные класса: |
| 105 | 1 | Dmitry Chernyak | # title - заголовок страницы. По-умолчанию: 'Base View'; |
| 106 | 1 | Dmitry Chernyak | # title_icon - иконка страницы в формате названия из пакета Font Awesome. По умолчанию: 'bus'; |
| 107 | 1 | Dmitry Chernyak | # position - идентификатор пункта меню, считающегося выбранным, когда страница открыта. По умолчанию: None; |
| 108 | 1 | Dmitry Chernyak | # breadcrumbs - значение, отвечающее за отображение "хлебных крошек" вверху страницы. По умолчанию: False; |
| 109 | 1 | Dmitry Chernyak | # menu - меню в левой колонке базового шаблона (см. "Редактирование меню"). По умолчанию: OrderedDict(); |
| 110 | 1 | Dmitry Chernyak | # template_name - имя шаблона, использующегося в базовом виде. По умолчанию: 'django_gentelella/base.html'. |
| 111 | 1 | Dmitry Chernyak | |
| 112 | 1 | Dmitry Chernyak | *GentelellaCreateView* - собственный вариант вида CreateView из django.views.generic. |
| 113 | 1 | Dmitry Chernyak | |
| 114 | 1 | Dmitry Chernyak | Переменные класса: |
| 115 | 1 | Dmitry Chernyak | # menu - меню в левой колонке базового шаблона (см. "Редактирование меню"). По умолчанию: NotImplemented; |
| 116 | 1 | Dmitry Chernyak | # title - заголовок страницы. По умолчанию: NotImplemented; |
| 117 | 1 | Dmitry Chernyak | # template_name - имя шаблона, использующегося в виде. По умолчанию: NotImplemented. |
| 118 | 1 | Dmitry Chernyak | # model - модель, объект которой создаётся в данном виде. По умолчанию: NotImplementedError |
| 119 | 1 | Dmitry Chernyak | # form_class - использующаяся на странице форма. По умолчанию: NotImplemented. |
| 120 | 1 | Dmitry Chernyak | # success_url - ссылка, на которую будет совершён переход при успешном создании объекта. По умолчанию: NotImplemented. |
| 121 | 1 | Dmitry Chernyak | |
| 122 | 1 | Dmitry Chernyak | Используется точно так же, как и CreateView из django.views.generic. |
| 123 | 1 | Dmitry Chernyak | |
| 124 | 1 | Dmitry Chernyak | h3. Тэги шаблонов |
| 125 | 1 | Dmitry Chernyak | |
| 126 | 1 | Dmitry Chernyak | *custom_table* - отрисовывает таблицу по заданным данным. В качестве аргументов принимает список данных и перечень полей (каждое поле записано как отдельный аргумент формата field__name="Name"). Первая строка внутри тэга - то, что следует отображать при отсутствии данных, далее - данные для тех полей с особым форматированием: |
| 127 | 1 | Dmitry Chernyak | |
| 128 | 1 | Dmitry Chernyak | <pre> |
| 129 | 1 | Dmitry Chernyak | {% field 'name' %} |
| 130 | 1 | Dmitry Chernyak | <b>{{ obj.name }}</b> |
| 131 | 1 | Dmitry Chernyak | </pre> |
| 132 | 1 | Dmitry Chernyak | |
| 133 | 1 | Dmitry Chernyak | Также поля можно подавать через объект OrderedDict, где ключи - это идентификаторы полей, а значения - заголовки: |
| 134 | 1 | Dmitry Chernyak | |
| 135 | 1 | Dmitry Chernyak | <pre> |
| 136 | 1 | Dmitry Chernyak | fields = OrderedDict(( |
| 137 | 1 | Dmitry Chernyak | ('first', 'First Thing'), |
| 138 | 1 | Dmitry Chernyak | ('second', 'Second Thing'), |
| 139 | 1 | Dmitry Chernyak | ('third', 'Third Thing'), |
| 140 | 1 | Dmitry Chernyak | ('pseudo', 'Pseudothing') |
| 141 | 1 | Dmitry Chernyak | )) |
| 142 | 1 | Dmitry Chernyak | </pre> |
| 143 | 1 | Dmitry Chernyak | |
| 144 | 1 | Dmitry Chernyak | Закрывающий тэг: @{% end_custom_table %}@ |
| 145 | 1 | Dmitry Chernyak | |
| 146 | 1 | Dmitry Chernyak | Данные для таблицы подаются в виде списка словарей, где ключи - это названия полей таблицы. |
| 147 | 1 | Dmitry Chernyak | |
| 148 | 1 | Dmitry Chernyak | Пример: |
| 149 | 1 | Dmitry Chernyak | |
| 150 | 1 | Dmitry Chernyak | <pre> |
| 151 | 1 | Dmitry Chernyak | table_contents = [{ |
| 152 | 1 | Dmitry Chernyak | 'first': 'Spam', |
| 153 | 1 | Dmitry Chernyak | 'second': 'Eggs', |
| 154 | 1 | Dmitry Chernyak | 'third': 'Spanish Inquisition', |
| 155 | 1 | Dmitry Chernyak | }, |
| 156 | 1 | Dmitry Chernyak | { |
| 157 | 1 | Dmitry Chernyak | 'first': 'Something Completely Different', |
| 158 | 1 | Dmitry Chernyak | 'second': 'Ni!', |
| 159 | 1 | Dmitry Chernyak | 'third': 'What is your favourite colour?' |
| 160 | 1 | Dmitry Chernyak | } |
| 161 | 1 | Dmitry Chernyak | ] |
| 162 | 1 | Dmitry Chernyak | </pre> |
| 163 | 1 | Dmitry Chernyak | |
| 164 | 1 | Dmitry Chernyak | <pre> |
| 165 | 1 | Dmitry Chernyak | {% custom_table table_contents field__first='First Thing' field__second='Second Thing' field__third='Third Thing' field__pseudo='Pseudothing' %} |
| 166 | 1 | Dmitry Chernyak | Nothing's going on here, citizen. |
| 167 | 1 | Dmitry Chernyak | {% field 'pseudo' %} |
| 168 | 1 | Dmitry Chernyak | Beware the simulacrum! |
| 169 | 1 | Dmitry Chernyak | {% end_custom_table %} |
| 170 | 1 | Dmitry Chernyak | </pre> |
| 171 | 1 | Dmitry Chernyak | |
| 172 | 1 | Dmitry Chernyak | <pre> |
| 173 | 1 | Dmitry Chernyak | {% custom_table table_contents fields %} |
| 174 | 1 | Dmitry Chernyak | Nothing's going on here, citizen. |
| 175 | 1 | Dmitry Chernyak | {% field 'pseudo' %} |
| 176 | 1 | Dmitry Chernyak | Beware the simulacrum! |
| 177 | 1 | Dmitry Chernyak | {% end_custom_table %} |
| 178 | 1 | Dmitry Chernyak | </pre> |
| 179 | 1 | Dmitry Chernyak | |
| 180 | 1 | Dmitry Chernyak | !table.png! |
| 181 | 1 | Dmitry Chernyak | |
| 182 | 1 | Dmitry Chernyak | *xpanel* - div-контейнер для элементов в виде панели. В качестве обязательного аргумента принимает заголовок. Пример: |
| 183 | 1 | Dmitry Chernyak | |
| 184 | 1 | Dmitry Chernyak | <pre> |
| 185 | 1 | Dmitry Chernyak | {% xpanel 'Заголовок' %} |
| 186 | 1 | Dmitry Chernyak | содержимое |
| 187 | 1 | Dmitry Chernyak | {% end_xpanel %} |
| 188 | 1 | Dmitry Chernyak | </pre> |
| 189 | 1 | Dmitry Chernyak | |
| 190 | 1 | Dmitry Chernyak | !panel.png! |
| 191 | 1 | Dmitry Chernyak | |
| 192 | 1 | Dmitry Chernyak | *modal* - контейнер для элементов в виде вызываемого модального окна. Принимает следующие аргументы: |
| 193 | 1 | Dmitry Chernyak | ## Заголовок |
| 194 | 1 | Dmitry Chernyak | ## size - размер окна |
| 195 | 1 | Dmitry Chernyak | ## id_ - идентификатор окна |
| 196 | 1 | Dmitry Chernyak | |
| 197 | 1 | Dmitry Chernyak | Пример использования: |
| 198 | 1 | Dmitry Chernyak | |
| 199 | 1 | Dmitry Chernyak | <pre> |
| 200 | 1 | Dmitry Chernyak | <button class='btn btn-primary' data-toggle="modal" data-target="#modal">Check messages</button> |
| 201 | 1 | Dmitry Chernyak | |
| 202 | 1 | Dmitry Chernyak | {% modal 'Заголовок' size='xl' id_='modal' %} |
| 203 | 1 | Dmitry Chernyak | Содержимое |
| 204 | 1 | Dmitry Chernyak | {% end_modal %} |
| 205 | 1 | Dmitry Chernyak | </pre> |
| 206 | 1 | Dmitry Chernyak | |
| 207 | 1 | Dmitry Chernyak | !modal.png! |
| 208 | 1 | Dmitry Chernyak | |
| 209 | 1 | Dmitry Chernyak | h3. Шаблоны |
| 210 | 1 | Dmitry Chernyak | |
| 211 | 1 | Dmitry Chernyak | *base* - базовый шаблон, в который встраиваются все страницы сайта в теме. |
| 212 | 1 | Dmitry Chernyak | *footer* - футер страницы. |
| 213 | 1 | Dmitry Chernyak | *login* - стандартная страница логина. |
| 214 | 1 | Dmitry Chernyak | |
| 215 | 1 | Dmitry Chernyak | h3. Редактирование бокового меню |
| 216 | 1 | Dmitry Chernyak | |
| 217 | 1 | Dmitry Chernyak | Для того чтобы сделать кастомное боковое меню, следует создать собственный вид, наследующийся от BaseView из django_gentelella, в котором указать переменную menu с желаемым меню, сформированным в формате OrderedDict. Каждый элемент словаря должен иметь в качестве ключа уникальный идентификатор, а в качестве значения - кортеж или список со следующими данными: |
| 218 | 1 | Dmitry Chernyak | # Название пункта |
| 219 | 1 | Dmitry Chernyak | # Ссылка, на которую ведёт пункт |
| 220 | 1 | Dmitry Chernyak | # Описание пункта |
| 221 | 1 | Dmitry Chernyak | # Права, которыми должен обладать пользователь для отображения или сокрытия пункта. Например ['right_to_view|1'], где слева от | указано название права, справа - показывать или, наоборот, скрывать пункт при наличии такого права у пользователя. |
| 222 | 1 | Dmitry Chernyak | # Дочерние пункты |
| 223 | 1 | Dmitry Chernyak | |
| 224 | 1 | Dmitry Chernyak | Пример использования: |
| 225 | 1 | Dmitry Chernyak | |
| 226 | 1 | Dmitry Chernyak | <pre> |
| 227 | 1 | Dmitry Chernyak | MENU = OrderedDict(( |
| 228 | 1 | Dmitry Chernyak | # название, ссылка, описание, 'права|показывать[01]', иконка |
| 229 | 1 | Dmitry Chernyak | ('main_page', ( |
| 230 | 1 | Dmitry Chernyak | 'Страница', reverse_lazy(''), |
| 231 | 1 | Dmitry Chernyak | 'Это страница, на ней написано', [], |
| 232 | 1 | Dmitry Chernyak | 'credit-card', OrderedDict(( |
| 233 | 1 | Dmitry Chernyak | ('ultra_main_page', ( |
| 234 | 1 | Dmitry Chernyak | 'Та же страница', reverse_lazy(''), |
| 235 | 1 | Dmitry Chernyak | 'Дочерний пункт меню', [], |
| 236 | 1 | Dmitry Chernyak | 'credit-card', OrderedDict(( |
| 237 | 1 | Dmitry Chernyak | |
| 238 | 1 | Dmitry Chernyak | )) |
| 239 | 1 | Dmitry Chernyak | )), |
| 240 | 1 | Dmitry Chernyak | )) |
| 241 | 1 | Dmitry Chernyak | )), |
| 242 | 1 | Dmitry Chernyak | ('submain_page', ( |
| 243 | 1 | Dmitry Chernyak | 'Та же страница', reverse_lazy('test'), |
| 244 | 1 | Dmitry Chernyak | 'Это та же самая страница', [], |
| 245 | 1 | Dmitry Chernyak | 'credit-card', OrderedDict(()) |
| 246 | 1 | Dmitry Chernyak | )), |
| 247 | 1 | Dmitry Chernyak | )) |
| 248 | 1 | Dmitry Chernyak | |
| 249 | 1 | Dmitry Chernyak | |
| 250 | 1 | Dmitry Chernyak | class MyBaseView(BaseView): |
| 251 | 1 | Dmitry Chernyak | menu = MENU |
| 252 | 1 | Dmitry Chernyak | template_name = 'django_gentelella/base.html' |
| 253 | 1 | Dmitry Chernyak | title_icon = 'balance-scale' |
| 254 | 1 | Dmitry Chernyak | title = 'DG Test' |
| 255 | 1 | Dmitry Chernyak | permission_required = () |
| 256 | 1 | Dmitry Chernyak | |
| 257 | 1 | Dmitry Chernyak | def get(self, request, *args, **kwargs): |
| 258 | 1 | Dmitry Chernyak | return super().get(request, *args, **kwargs) |
| 259 | 1 | Dmitry Chernyak | </pre> |
| 260 | 1 | Dmitry Chernyak | |
| 261 | 1 | Dmitry Chernyak | Создаваемые впоследствие виды наследоваться от MyBaseView. |
| 262 | 1 | Dmitry Chernyak | |
| 263 | 1 | Dmitry Chernyak | !menu.png! |
| 264 | 1 | Dmitry Chernyak | |
| 265 | 1 | Dmitry Chernyak | h3. Тэги |
| 266 | 1 | Dmitry Chernyak | |
| 267 | 1 | Dmitry Chernyak | Тэги - это шаблоны компонентов, которые можно импортировать в собственный шаблон для стандартизированного рендера отдельных его частей. |
| 268 | 1 | Dmitry Chernyak | |
| 269 | 1 | Dmitry Chernyak | **form_template** - шаблон для рендера форм. |
| 270 | 1 | Dmitry Chernyak | Пример использования: |
| 271 | 1 | Dmitry Chernyak | |
| 272 | 1 | Dmitry Chernyak | <pre> |
| 273 | 1 | Dmitry Chernyak | {% include 'django_gentelella/tags/form_template.html' with form=form %} |
| 274 | 1 | Dmitry Chernyak | </pre> |
| 275 | 1 | Dmitry Chernyak | |
| 276 | 1 | Dmitry Chernyak | !form_t.png! |
| 277 | 1 | Dmitry Chernyak | |
| 278 | 1 | Dmitry Chernyak | h3. Скрипты |
| 279 | 1 | Dmitry Chernyak | |
| 280 | 1 | Dmitry Chernyak | *native_message* - скрипт на JS для создания браузерных уведомлений. Принимает следующие аргументы: |
| 281 | 1 | Dmitry Chernyak | # title - заголовок; |
| 282 | 1 | Dmitry Chernyak | # message - сообщение; |
| 283 | 1 | Dmitry Chernyak | # options - опции уведомления. |
| 284 | 1 | Dmitry Chernyak | |
| 285 | 1 | Dmitry Chernyak | h2. Дополнительные материалы |
| 286 | 1 | Dmitry Chernyak | |
| 287 | 1 | Dmitry Chernyak | "Gentelella Alela!":https://colorlib.com/polygon/gentelella/index.html - демо-страница темы Gentelella. |