17. Конфигурация и настройки
26 октября 2016 г. 14:05
Сам фреймворк djangoSHOP требует всего несколько директив. Однако, каждый интернет-магазин строится вокруг djangoSHOP, который состоит из собственного приложения продавца и содержит коллекцию сторонних Django приложений. В этом разделе мы рассмотрим конфигурационные настройки приложений:
17.1. Настройки DjangoSHOP
17.1.1. Название приложения
Это название требуется для конфигурации имён таблиц в базе данных, а также для реализации торговли.
SHOP_APP_LABEL = 'myshop'
17.1.2. Альтернативная пользовательская модель
Во встроенной модели пользователя в Django не хватает несколько функций, которые требуются для djangoSHOP: в основном, возможность использовать эл. почту как логин для входа на сайт. Эта переопределяемая модель на 100% совместима со встроенной модели пользователя Django и даже переиспользует саму таблицу auth_user в базе данных.
AUTH_USER_MODEL = 'email_auth.User'
Так как эта модель пользователя намеренно не обеспечивает уникальность email адресов, то нужно отметить, чтобы Django "молчаливо" реагировал на данное предупреждение:
SILENCED_SYSTEM_CHECKS = ('auth.W004')
Более подробную информацию смотрите в разделе Модель покупателя.
17.1.3. Authentication Backends
AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend',
'allauth.account.auth_backends.AuthenticationBackend',
)
17.1.4. Currency
Для указания типа Money мы можем воспользоваться следующей константой:
SHOP_DEFAULT_CURRENCY = 'EUR'
$ 1.23 - типичный формат для рендера суммы, но некоторые продавцы предпочитают 1.23 USD. Используя следующую настройку
SHOP_MONEY_FORMAT = '{symbol} {amount}'
мы можем указать конкретный формат вывода, где {symbol} - это €, $, £ и т. д. и {currency} - это EUR, USD, GBP и т. д.
17.1.5. Модификаторы корзины
Каждый проект требует по крайней мере один модификатор для инициализации корзины. В большинстве реализаций shop.modifiers.defaults.DefaultCartModifier будет достаточно, но в зависимости от моделей продукта, продавец может захотеть альтернативную реализацию.
Для идентификации налогов в корзине, используйте один из предоставленных налоговых модификаторов или создайте свой.
Другие модификаторы могут добавлять дополнительные стоимости оплаты и доставки, или пересчитывать общую стоимость при любых обстоятельствах.
SHOP_CART_MODIFIERS = (
'shop.modifiers.defaults.DefaultCartModifier',
'shop.modifiers.taxes.CartExcludedTaxModifier',
# other modifiers
)
Более подробную информацию смотрите в разделе Модификаторы корзины.
17.1.6. Установленные Django приложения
Имеется конфигурация, которая работает. Специальные и дополнительные приложения обсуждаются ниже.
INSTALLED_APPS = (
'django.contrib.auth',
'email_auth',
'polymorphic',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'djangocms_admin_style',
'django.contrib.admin',
'django.contrib.staticfiles',
'django.contrib.sitemaps',
'djangocms_text_ckeditor',
'django_select2',
'cmsplugin_cascade',
'cmsplugin_cascade.clipboard',
'cmsplugin_cascade.sharable',
'cmsplugin_cascade.extra_fields',
'cmsplugin_cascade.segmentation',
'cms_bootstrap3',
'adminsortable2',
'rest_framework',
'rest_framework.authtoken',
'rest_auth',
'django_fsm',
'fsm_admin',
'djng',
'cms',
'menus',
'treebeard',
'compressor',
'sekizai',
'sass_processor',
'django_filters',
'filer',
'easy_thumbnails',
'easy_thumbnails.optimize',
'parler',
'post_office',
'haystack',
'shop',
'my_shop_implementation',
)
- email_auth опционально, но рекомендуется, переопределяет встроенную аутентификацию. Должно быть добавлено после django.contrib.auth.
- polymorphic необходимо, если в сайте требуется более, чем один тип модели продукта. Требуется установить django-polymorphic.
- djangocms_text_ckeditor опционально, добавляет WYSIWYG HTML редактор, который хорошо интегрирован с djangoCMS.
- django_select2 опционально, добавляет поле выбора (select) в Django админку, которая добавляет автозаполнение. Полезно для ручного добавления ссылок на продукты. Требуется установить django-select2.
- cmsplugin_cascade добавляет функциональность для добавления CMS плагинов, которые предоставляются django-SHOP для заполнения CMS заполнителей.
- cmsplugin_cascade.clipboard позволяет администратору копировать набор плагинов из одного сайта в другой.
- cmsplugin_cascade.sharable позволяет администратору распространять заранеее настроенный конфигурационный набор атрибутов в алиас для переиспользования другими плагинами такого же типа.
- cmsplugin_cascade.extra_fields позволяет администратору добавлять произвольные CSS классы, стили и ID-поля для определённых плагинов.
- cmsplugin_cascade.segmentation позволяет сегментировать набор плагинов в логические единицы.
- cms_bootstrap3 добавляет некоторые шаблоны и шаблонные теги для рендера стилизованного меню и навигационных баров, используя фреймворк Bootstrap 3.
- adminsortable2 позволяет администратору сортировать различные элементы в административной части сайта.
- rest_framework, rest_framework.authtoken and rest_auth, необходимо для REST функциональности в djangoSHOP.
- django_fsm and fsm_admin, необходимо для Машины конечных состояний (Finite State Machine) в djangoSHOP.
- djng необходимо лишь для инсталяции, используя AngularJS, который рекомендуется в качестве JavaScript фреймворка. Добавляет слой интерфейса между Django и AngularJS и требует, чтобы django-angular был установлен.
- cms, menus and treebeard требуются если djangoSHOP используется в сочетании с djangoCMS.
- compressor, настоятельно рекомендуется. Склеивает и минифицирует CSS и JavaScript файлы на боевом сервере. Должен быть установлен django-compressor.
- sekizai, настоятельно рекомендуется и позволяет группировать CSS и JavaScript файлы. Должен быть установлен django-sekizai.
- sass_processor, опционально, но рекомендуется. Используется для конвертации SASS в CSS вместе нформацией отладки. Должен быть установлен django-sass-processor.
- django_filters, опционально, используется для фильтрации продуктов по их атрибуту с использованием параметров запроса.
- filer, очень рекомендуется, управляет вашими медиа-файлами в Django. Должен быть установлен django-filer.
- easy_thumbnails и easy_thumbnails.optimize настоятельно рекомендуется, обрабатывает генерацию миниатюр и оптимизирует их. Должен быть установлен easy-thumbnails.
- parler - опциональный фреймворк, который обрабатывает переводы полей модели на другие языки.
- post_office настоятельно рекомендуется. Приложение по асинхронной отправки почтовых сообщений, который не прерывает цикл запрос-ответ, когда отправляет письмо.
- haystack опционально, обрабатывает интерфейс между Django и Elasticsearch – полнотекстового поискового механизма. Должен быть установлен ElasticSearch, django-haystack и drf-haystack.
- shop - djangoSHOP фреймворк.
- my_shop_implementation - собственная реализация торговли этого интернет-магазина.
17.1.7. Классы промежуточного слоя
Это конфигурация проверена и работает. Специальные классы промежуточного слоя обсуждаются ниже.
MIDDLEWARE_CLASSES = (
'djng.middleware.AngularUrlMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'shop.middleware.CustomerMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.gzip.GZipMiddleware',
'cms.middleware.language.LanguageCookieMiddleware',
'cms.middleware.user.CurrentUserMiddleware',
'cms.middleware.page.CurrentPageMiddleware',
'cms.middleware.toolbar.ToolbarMiddleware',
)
- djng.middleware.AngularUrlMiddleware добавляет специальный маршутизатор для того, чтобы использовать Django реверс-функцию из JavaScript.
- shop.middleware.CustomerMiddleware добавляет объект Customer в каждый запрос.
17.1.8. Статические файлы
Если компрессор и/или sass_processor есть в INSTALLED_APPS, то добавьте их искатели в список STATICFILES_FINDERS
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
'sass_processor.finders.CssFinder',
'compressor.finders.CompressorFinder',
)
Так как djangoSHOP требует несколько пакетов сторонних приложений, которые не доступны из PyPI, они могут быть инсталированы через npm. Для того, чтобы сделать эти файлы доступными в нашем Django приложении, мы должны использовать следующую настройку:
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
('node_modules', os.path.join(PROJECT_ROOT, 'node_modules')),
)
Некоторые файлы инсталлированные через npm обрабатываются django-sass-processor и, следовательно, их пути должны быть доступны:
NODE_MODULES_URL = STATIC_URL + 'node_modules/'
SASS_PROCESSOR_INCLUDE_DIRS = (
os.path.join(PROJECT_ROOT, 'node_modules'),
)
17.1.9. Шаблонные процессоры контекста
Шаблоны, которые рендерятся с помощью djangoSHOP, требуют объект Customer в их контексте. Для конфигурации добавьте настройки шаблонные процессоры контекста:
TEMPLATES = [{
...
'OPTIONS': {
'context_processors': (
...
'shop.context_processors.customer',
'shop.context_processors.version',
),
},
}]
17.1.10. Workflow-миксины
SHOP_ORDER_WORKFLOWS = (
'shop.payment.defaults.PayInAdvanceWorkflowMixin',
'shop.shipping.defaults.CommissionGoodsWorkflowMixin',
# other workflow mixins
)
17.1.11. REST фреймворк
REST фреймворк требует специальных настроек. Мы точно должны сообщить ему, как сериализовать наш специальный тип Money:
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': (
'shop.rest.money.JSONRenderer',
'rest_framework.renderers.BrowsableAPIRenderer',
),
'DEFAULT_FILTER_BACKENDS': ('rest_framework.filters.DjangoFilterBackend',),
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
'PAGE_SIZE': 12,
}
SERIALIZATION_MODULES = {'json': str('shop.money.serializers')}
17.1.12. Django CMS и Cascade настройки
DjangoSHOP требует по крайней мере один CMS шаблон. Убедитесь, что он содержит заполнитель.
CMS_TEMPLATES = (
('myshop/pages/default.html', _("Default Page")),
)
CMS_PERMISSION = False
DjangoSHOP обогащает djangocms-cascade несколькими специфическими плагинами для интернет-магазина.
from cmsplugin_cascade.extra_fields.config import PluginExtraFieldsConfig
CMSPLUGIN_CASCADE_PLUGINS = ('cmsplugin_cascade.segmentation', 'cmsplugin_cascade.generic',
'cmsplugin_cascade.link', 'shop.cascade', 'cmsplugin_cascade.bootstrap3',)
CMSPLUGIN_CASCADE = {
'link_plugin_classes': (
'shop.cascade.plugin_base.CatalogLinkPluginBase',
'cmsplugin_cascade.link.plugin_base.LinkElementMixin',
'shop.cascade.plugin_base.CatalogLinkForm',
),
'dependencies': {
'shop/js/admin/shoplinkplugin.js': 'cascade/js/admin/linkpluginbase.js',
},
'alien_plugins': ('TextPlugin', 'TextLinkPlugin',),
'bootstrap3': {
'template_basedir': 'angular-ui',
},
'plugins_with_extra_fields': {
'ExtraAnnotationFormPlugin': PluginExtraFieldsConfig(),
'ShopProceedButton': PluginExtraFieldsConfig(),
'ShopAddToCartPlugin': PluginExtraFieldsConfig(),
},
'segmentation_mixins': (
('shop.cascade.segmentation.EmulateCustomerModelMixin',
'shop.cascade.segmentation.EmulateCustomerAdminMixin'),
),
'plugins_with_extra_render_templates': {
'CustomSnippetPlugin': [
('shop/catalog/product-heading.html', _("Product Heading"))
],
},
}
Так как мы хотим добавлять произвольные ссылки на карточку продукта, django-SHOP предлагает модифицированный плагин Ссылка. И должна быть включена с помощью 3-кортежного link_plugin_classes. Имеется также вспомогательный файл JavaScript shop/js/admin/shoplinkplugin.js, который зависит от другого JavaScript файла.
DjangoSHOP использует AngularJS вместо jQuery для контоля его динамических HTML виджетов. Поэтому мы вынуждены переопределить значение по умолчанию следующей настройкой: CMSPLUGIN_CASCADE['bootstrap3']['template_basedir']
Более подробная информация об этих настройках содержится в разделе djangocms-cascade.
17.1.13. Полнотекстовый поиск
Если вы установили и запустили ElasticSearchEngine, то конифгурация Haystack будет выглядеть следующим образом:
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
'URL': 'http://localhost:9200/',
'INDEX_NAME': 'my_prefix-en',
},
}
Если вы хотите индексировать другой язык, например, немецкий, то добавьте другой префикс:
HAYSTACK_CONNECTIONS = {
...
'de': {
'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
'URL': 'http://localhost:9200/',
'INDEX_NAME': 'my_prefix-de',
}
}
HAYSTACK_ROUTERS = ('shop.search.routers.LanguageRouter',)
17.1.14. Другие различные настройки
Из соображений удобства и простоты использования имеет смысл обновлять изменение корзины только по истечении определенного времени бездействия. Эта конфигурация устанавливает 2500 миллисекунд:
SHOP_EDITCART_NG_MODEL_OPTIONS = "{updateOn: 'default blur', debounce: {'default': 2500, 'blur': 0}}"
Измените подклюённый путь к локальной директории, если вы не хотите загружать статику с CDN:
SELECT2_CSS = 'node_modules/select2/dist/css/select2.min.css' SELECT2_JS = 'node_modules/select2/dist/js/select2.min.js'
Так как на стороне клиента не разрешается делать какие-либо ценовые и количественные расчеты, Decimal значения передаются клиенту с помощью строки. Это также позволяет избежать неприятных ошибок округления.
COERCE_DECIMAL_TO_STRING = True
Запрет на отображения всех переходов, настроенных с помощью workflow-миксинов внутри бэкенда администрирования:
FSM_ADMIN_FORCE_PERMIT = True
Представляю вашему вниманию книгу, написанную моим близким другом Максимом Макуриным: Секреты эффективного управления ассортиментом.
Книга предназначается для широкого круга читателей и, по мнению автора, будет полезна специалистам отдела закупок и логистики, категорийным и финансовым менеджерам, менеджерам по продажам, аналитикам, руководителям и директорам, в компетенции которых принятие решений по управлению ассортиментом.
Комментарии: 0