Закрыть

Для эффективной работы на сайте используются cookie и обработка персональных данных. Пользуясь этим сайтом, вы соглашаетесь с правилами использования сайта. Подробнее

Цитата дня

Vivazzi.ru

Личный сайт Мальцева Артема

Вежливость — это такое качество человеческой натуры, которое помогает не замечать поломанной калитки, но обращать внимание на цветы за этой калиткой.

Дейл Карнеги

IT Блог

Статьи на технические темы

Как добавить страницу в админку django

Добавление своей страницы в админку django мало чем отличается от добавления страницы в публичную часть сайта и осуществляется за несколько простых шагов. Но для начала создадим новое приложение spec в нашем проекте со следующей структурой:

my_project
├─ spec
│ ├─ templates
│ │ └─ admin_custom_page.html
│ ├─ __init__.py
│ ├─ urls.py
│ └─ views.py
├─ __init__.py
├─ settings.py
└─ urls.py

А затем добавим в settings.py наше приложение spec:

INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.admin',
'django.contrib.sitemaps',

'djangocms_text_ckeditor',

'cms',
'treebeard',
'menus',
'sekizai',

'spec',
)

1. Создания представления

Пишем обычное представление в views...


Сортировка по полю в django admin

Для сортировки по полю в админке Django в списке объектов используется свойство admin_order_field.

Пример сортировки продуктов по их доступности (активности) в списке всех продуктов:

@admin.register(ProductActivate)
class ProductActivateAdmin(admin.ModelAdmin):
list_display = ('product', 'publication_date', 'activation_applied', 'active')
ordering = ('product__active', 'publication_date')

def active(self, obj):
return obj.product.active
active.short_description = 'Активен продукт?'
active.admin_order_field = 'product__active'
active.boolean = True


Установка и запуск ElasticSearch

Так как Elasticsearch написан на Java, то сначала нужно установить соответствующее виртуальное окружение JRE:

sudo apt-get update
sudo apt-get install openjdk-7-jre

Elasticsearch можно загрузить с официального сайта:

На данный момент я использую elasticsearch версии 2.2.0:

cd /opt/
wget https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-2.2.0.deb
dpkg -i elasticsearch-2.2.0.deb

Запуск elasticsearch осуществляется командой:

service elasticsearch start

Как правило, elasticsearch добавляют в автозапуск linux, поэтому сначала откроем файл с командами на автозапуск:

nano /etc/init.d/local

А затем добавим:

#! /bin/sh
...
service elasticsearch start

Настраиваем файл /etc/init.d/local на автозагрузку:

sudo...


html_content с вложениями в django-post_office

Обнаружил странную проблему при прикреплении файла в django-post-office (по крайней мере это наблюдается в версии 2.0.8 и ниже): когда посылаешь письмо, состоящее из html-контента с прикреплением любого файла (неважно какого формата), то письмо приходит, но без прикрепленного файла.

Использовались версии пакетов:

django==1.10.7 (и ниже)
django-post-office==2.0.8 (и ниже)

Более подробно поведение django-post-office указанной версии и работу функции mail.send() можно описать так:

Посылаешь письмо с обычным содержанием, используя параметр message, и прикрепляешь файл - работает правильно, т. е. видим и текст письма и вложение.
Посылаешь письмо с содержанием, содержащее html-теги или даже обычный текст...


Определить, какой режим установлен в django-cms

Чтобы определить, какой на данный момент стоит режим просмотра страницы или его редактирования, можно воспользоваться переменной request.toolbar.edit_mode.

Например так можно выводить отладочную информацию по своему плагину в шаблоне:

{% if request.toolbar.edit_mode %}
<div class="debug_panel">...</div>
{% endif %}

Примечание
Можно использовать и переменную request.current_page.publisher_is_draft, но в этом случае не всегда можно точно определить, в каком режиме вы находитесь request.toolbar.edit_mode, например, если вы находитесь на странице вашего созданного приложения.


Автоматическое изменение высоты окна в fancybox

Наткнулся на ошибку автоматического изменения высоты всплывающего окна fancybox. Модальное окно должно автоматически изменять размер при динамическом добавлении, удалении или изменении размеров элементов внутри окна, но, как оказалось, оно перестаёт автоматически меняться если задана опция минимальной ширины minWidth. Так, например, следующая конфигурация будет ломать авто изменение высоты:

<a class="btn show_modal" href='#modal_content'>Открыть модальное окно</a>

<div id="modal_content">
<p>Содержимое модального окна</p>
</div>

$('.show_modal').fancybox({
minWidth: 500, # из-за этого параметра minWidth ломается автоматическое измение высоты модального окна
maxWidth: 900,
maxHeight: 600
});

Для решения подобного "эффекта" нужно убрать этот параметр:

$('.show_modal').fancybox({
maxWidth: 900,
maxHeight: 600
});

И...


Данные управляющей формы отсутствуют или были повреждены

Редко встречающаяся ошибка в Django: "Данные управляющей формы отсутствуют или были повреждены" может возникать по разным причинам:

1. Отсутствует переменная formset.management_form в шаблоне. Решение: добавить в шаблон:

{{ formset.management_form }}

2. После обновления библиотек, например Django, на новую версию. В таком случае нужно проверить совместимость версий библиотек и соответственно всё обновить.

3. Если вы используете django-nested-admin, то проверьте везде ли вы наследуетесь от NestedTabularInline / NestedStakedInline для своих инлайновых admin-класс, например:

class TilePictureInline(NestedStackedInline):
model = TilePicture
extra = 0

class ColorInPatternInline(NestedTabularInline):
model = ColorInPattern
extra = 0

class TileInline(NestedStackedInline):
model = Tile
extra = 0
inlines = (TilePictureInline, ColorInPatternInline)

class TileAdmin(NestedModelAdmin):
...


Не открывается страница на сайте Django

Встретил весьма странную проблему: не открывается страница на сайте django cms. То есть нажимаешь обновить страницу, и индикатор загрузки крутится и не может показать страницу. Логи в IDE вообще молчат: ничего не показывают, как будто я вовсе и не загружаю страницу.

Попробуйте почистить папку, куда складывается вся статика после вызова команды pytrhon manage.py collectstatic. В моём случае такая папка называется collect_static.

Кому интересно можете прочитать, как я находил ошибку.

Эта ошибка, действительно, вызвала во мне бурю эмоций, ведь конкретная страница "Контакты" не открываются, хотя другие страницы открываются. Я начал копать в чём же дело.

Прежде всего поочерёдно поотключал placeholders...


django rest framework 405 method not allowed

Причины возникновения ошибки 405 method not allowed достаточно много. Если вы используете django-shop, то попробуйте проверить импорт настройки в settings.py:

MIDDLEWARE_CLASSES = (
...
'shop.middleware.MethodOverrideMiddleware',
...
)

Конечно, можно отдельно от django-shop использовать этот middleware в своих проектах. Сам код middleware представляет собой следующее:

class MethodOverrideMiddleware(object):
"""
This middleware is required to emulate methods PUT and DELETE using a HTTP method POST
as wrapper. Some misconfigured proxies do not pass these methods properly, hence this
workaround is required.
"""
METHOD_OVERRIDE_HEADER = 'HTTP_X_HTTP_METHOD_OVERRIDE'

def process_view(self, request, callback, callback_args, callback_kwargs):
if request.method != 'POST':
return
if self.METHOD_OVERRIDE_HEADER not in request.META:
return
request.method...


Пустая строка в select angular

Значение, которое вы хотите присвоить для select в angular, должно быть строковым типом. Вот пример правильного присваивания:

<div class="sb_tyre_calc" ng-controller="my_ctrl">
<label for="id_my_field">Ширина</label>
<select id="id_my_field" name="my_field" ng-change="update()" ng-model="my_field">
<option value="145">145</option>
<option value="185">185</option>
</select>
</div>

(function(angular, undefined) {
'use strict';

angular.module('my_module', []).controller('my_ctrl', function($scope) {
$scope.init = function() {
$scope.my_field = '185'; # именно в кавычках!
...
};

$scope.update = function() {
...
};

$scope.init();
$scope.update();
});

})(window.angular);

Обратите внимание, что присваивая my_field в функции init(), а именно $scope.my_field = '185' мы должны передать строковое значение...


Вам нужно саморазвиваться или вы хотите зарабатывать деньги?

Или вы ищите хорошие IT сервисы или книги? Сохраните свое время и взгляните на мою подборку рекомендаций, которыми постоянно пользуюсь.
Посмотреть рекомендации

На данный момент нет специального поиска, поэтому я предлагаю воспользоваться обычной поисковой системой, например, Google, добавив "vivazzi" после своего запроса.

Попробуйте