IT Блог

Документации и переводы

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

Unable to get repr for <class 'django.db.models.query.QuerySet'>. Поиск по тегам в плагинах django

Захотелось мне реализовать поиск картинок по названию тега (Картинка - это мною написанный django-cms плагин; а теги - подключённое приложение taggit), но не тут-то было. Впрочем, всё по-порядку.

Во-первых, имеем модель:

# models.py
class Picture(CMSPlugin):
    pic = models.ImageField(u'Картинка', upload_to='pictures', max_length=255)
    tags = TaggableManager(blank=True)

А во-вторых, нужно найти картинки по необходимому тегу. И если мы захотим осуществить поиск как-то так:

pictures = Picture.objects.filter(placeholder__page__publisher_is_draft=True).filter(tags__name=search_value)  

то ничего не выйдет. Не сработает: Django сообщит Unable to get repr for <class 'django.db.models.query.QuerySet'>.

Скажу честно, я так и не смог понять, почему код выше не работает.

Мне пришлось написать следующий код, чтобы решить мою задачу....


Сохранение тегов (taggit) при публикации страницы в django-cms

В документации по taggit имеется пример сохранения тегов через форму, но нет примера сохранения в модели (например, для плагина django-cms)... Но это и понятно. Сохранение связи многие-ко-многим происходит обычным образом (в django документации есть хорошие примеры). Я лишь покажу, как сохранить теги при публикации страницы в django-cms.

Копирование связей происходит в методе copy_relations(self, old_instance), например:

# models.py
class Picture(CMSPlugin):
    pic = models.ImageField('Картинка', upload_to='pictures', max_length=255)
    tags = TaggableManager(blank=True)

   def copy_relations(self, old_instance):
        self.tags.clear()
        for tag in old_instance.tags.all():
            self.tags.add(tag.name)

        self.save()

Для сохранения формы в views.py пишем следующее (взято с документации):

# views.py
if request.method == "POST":
    form = MyFormClass(request.POST)
    if form.is_valid():
        obj...

Миграции не создаются, ошибка dependencies references nonexistent parent node

Иногда у меня не создаются миграции. Обычно нужно сделать так: для того чтобы создавались миграции, в нужном приложении необходимо создать папку migrations (и положить туда __init__.py). И не забыть прописать приложение в settings.py. И тогда при вызове команды python manage.py makemigrations создадутся миграции.

Но что делать, когда возникает ошибка dependencies references nonexistent parent node? Подробнее на примере.

У меня возникла эта ошибка, когда я поставил taggit (приложение, позволяющее прикручивать теги к объектам) и по-инерции прописал в settings.py следующее:

MIGRATION_MODULES = {
    'cms': 'cms.migrations_django',
    'menus': 'menus.migrations_django',
    'djangocms_text_ckeditor': 'djangocms_text_ckeditor.migrations_django',
    'taggit': 'taggit.south_migrations',
}

Как написано в документации Django по миграциям: "запишите...


ValueError: invalid literal for int() with base 10

Если у вас не сохраняются картинки на сайте или если при публикации страницы или копировании плагинов django-cms трейсбек выдаёт что-то подобное:

ValueError: invalid literal for int() with base 10: '1/ru/publish/template/css/base.css'

Или

OSError: [Errno 13] Permission denied: '/home/path/to/media/'

это значит, что не достаточно прав на выполнение операции. Обычно права на папку media принадлежат пользователю www-data, поэтому перейдите в терминале в папку, где лежит media, и наберите:

$ chown -R www-data:www-data media/

str to unicode python

Хороший пример наглядно почувствовать преобразование str в unicode и обратно:

'test'.decode('utf-8')  # str to unicode - u'test' 
'test'.encode('utf-8')  # unicode to str - 'test'

Или

'Äîáðî ïîæàëîâàòü'.decode('windows-1251')  # str to unicode - u'Добро пожаловать' 

Что такое доменное имя и хостинг и зачем они нужны?

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

Доменное имя (или домен) - это адрес сайта, например: мой-сайт.рф, my-site.ru и т. д.

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

Проведу некоторую аналогию. Например, вы хотите построить дом! Для этого нанимаете строителей, чтобы его построить, а для сайта - это программистов и дизайнеров веб-студии. После постройки дома начинается оплата за землю. То есть за...


django преобразование или экранирование символов на спецсимволы в HTML

Пример преобразования (экранирования) небезопасных символов (", <, > и т.д.) в python-коде:

from django.utils.html import escape  # Эта функция и преобразует символы ", <, > и т.д. в безопасные символы

def get_link(obj):
    title = u' title="{}"'.format(escape(obj.title))
    return safe(u'<a href="{0}"{1}>{1}</a>'.format(obj.link, title))

Как сгруппировать/изменить порядок отображения плагинов в меню django-cms

Я пока не нашёл способов изменить порядок отображения плагинов в меню заполнителя при добавлении плагина. Они упорядочены по алфавиту и могут быть сгруппированны. Для этого нужно добавить параметр module при описании плагина в cms_plugins.py. Например:

class TestPlugin(CMSPluginBase):
    module = 'Test module'
    render_template = 'test_plugin.html'
    name = 'Тестовый плагин'
    model = TestModel

Отключить тачпад в linux

На линуксе минте 17.1 можно сделать следующим образом:

1. Зайти в "Меню -> Параметры -> Мышь" и включить пункт "Запретить сенсорную панель на время набора текста".

2. Если вы хотите полностью отключить тачпал, то установите пакет gpointing-device-settings.

$ sudo apt-get install gpointing-device-settings

После этого в "Меню -> Параметры" появится новый пункт под названием Pointing Devices. В этом приложении можно полностью отключить тачпад. Также это приложение содержит кучу других полезных настроек.


Google блокирует попытку авторизации с моего сайта или как разрешить доступ Google авторизации из другого места удаленно?

Столкнулся с такой проблемой: я хочу, чтобы мое приложение отправляло письма с формы обратной связи через зарегистрированную gmail почту. Но письма с новой зарегистрированной эл. почты не приходят. Google блокирует попытку авторизации с моего сайта и оповещает об этом:

  • Во вкладке "Безопасность" (в настройках аккаунта гугл) выводит: "Попытка входа из приложения или с устройства заблокирована".
  • Присылает письмо "Предотвращена попытка входа в аккаунт":

Нужно нажать "Посмотреть действия" и в следующем окне нажать "Да" ("Да это был я!"):

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

Если...

Представляю вашему вниманию книгу, написанную моим близким другом Максимом Макуриным: Секреты эффективного управления ассортиментом.

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

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

Попробуйте

Выберите валюту для отображения денежных единиц