«Где чёртов паспорт?»: Как я победил домашний хаос с Django и QR.

«Где чёртов паспорт?»: Как я победил домашний хаос с Django и QR.

Привет, дорогой читатель! Признавайся: у тебя тоже есть та самая «коробка с важным», где лежит всё — от гарантии на холодильник до первой детской соски? И каждый раз, когда нужно найти что-то конкретное, ты устраиваешь археологические раскопки, кляня себя за отсутствие системы?

Со мной так и было. Пока в прошлую субботу, разгребая завалы перед приездом тестя, я не осознал: я — инженер, создаю сложные системы, но не могу организовать собственную квартиру. Это вызов. И я принял его. За один вечер, пару литров кофе и с помощью старого доброго Django я построил HomeInventory — систему учёта всего, что у меня есть, с QR-кодами и мобильным поиском.

Добро пожаловать под капот этого микропроекта. Это история не о масштабировании на миллионы, а о том, как, имея правильные инструменты, можно решить бытовую проблему с инженерной элегантностью.

«Где чёртов паспорт?»: Как я победил домашний хаос с Django и QR.

🚀 Боль, которая родила идею: «Оно где-то здесь...»

Ситуация знакома любому, кто переезжал, ремонтировал или просто живёт. Три вечных вопроса:

  1. В какой из десяти одинаковых коричневых коробок после переезда лежит зарядка от PlayStation?
  2. Кому я одолжил паяльник полгода назад?
  3. Истекла ли уже гарантия на стиральную машину?

Ручные списки в Google Sheets не работают — они не привязаны физически к предметам. Специальные приложения — overkill, да и сканировать что-то надо. Мне же хотелось: подошел к коробке → навел камеру → мгновенно получил всё, что нужно знать. И чтобы всё под моим контролем, без подписок. Звучит как задача для красивого пет-проекта, верно?

🤖 Часть 1: Выбор оружия — Почему Django? (И почему не что-то ещё)

В 2025 году выбор фреймворков огромен. FastAPI для API, Flask для микросервисов, куча JS-фреймворков. Но мой критерий был прост: «батарейки в комплекте» и «работать должно уже вчера».

Мой стек оказался предсказуемо классическим и невероятно эффективным:

  • Django 4.2 LTS: Мой старый друг. Здесь мне нужна была не скорость написания API (с этим FastAPI справился бы лучше), а мгновенная готовность админ-панели. Django Admin — это готовый, безопасный CRUD-интерфейс для управления данными, который создается буквально десятью строками кода. ORM для работы с базой, встроенная аутентификация, миграции — всё из коробки. Зачем строить велосипед, если тебе дали сразу Tesla?
  • SQLite: Для MVP и личного использования — идеально. Один файл db.sqlite3 в проекте, ноль настроек. Когда (и если) проект вырастет, миграция на PostgreSQL — дело пары изменений в settings.py.
  • Bootstrap 5: Мне нужен был хотя бы минимальный приличный фронтенд для страницы сканирования и просмотра. Bootstrap даёт это за пять минут, с мобильной адаптацией «из коробки». Не хайпово, зачем практично.
  • HTML5 QR Code Scanner (html5-qrcode): Ключевая библиотека. Она позволяет использовать камеру телефона прямо в браузере, без установки нативных приложений. Магия WebRTC в чистом виде. Пользователь заходит на сайт, дает разрешение на камеру — и вот он, сканер.

Философия выбора: Не усложнять. Взять проверенные, максимально готовые инструменты, чтобы сосредоточиться на логике, а не настройке.

Часть 2: Разбираем фичи «под капотом»

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

Фича 1: QR-код, который рождается сам

Самая элегантная часть. Мне нужно, чтобы при добавлении новой вещи (скажем, «Документы на машину») в базу автоматически генерировался и сохранялся QR-код, ведущий на страницу этой вещи.

Как это работает в models.py:

import qrcode from django.db import models from io import BytesIO from django.core.files import File class Item(models.Model): name = models.CharField(max_length=200) # "Паспорт" location = models.CharField(max_length=200) # "Сейф, верхняя полка" box = models.ForeignKey('Box', on_delete=models.SET_NULL, null=True) # Связь с коробкой notes = models.TextField(blank=True) qr_code = models.ImageField(upload_to='qrcodes/', blank=True) # Поле для картинки QR def get_absolute_url(self): return reverse('item_detail', kwargs={'pk': self.pk}) def generate_qr(self): # Генерируем URL для этого объекта url = f"https://myhomeinventory.ru{self.get_absolute_url()}" # На продакшене — реальный домен qr_img = qrcode.make(url) # Сохраняем картинку в памяти, а потом в поле ImageField buffer = BytesIO() qr_img.save(buffer, format='PNG') buffer.seek(0) self.qr_code.save(f'item_{self.id}.png', File(buffer), save=False) def save(self, *args, **kwargs): # Сначала сохраняем объект, чтобы у него появился id super().save(*args, **kwargs) # Потом генерируем QR-код, если его ещё нет if not self.qr_code: self.generate_qr() super().save(update_fields=['qr_code']) # Сохраняем только обновлённое поле QR

🔮Что тут магического? Ты создаешь объект в админке, жмешь «Сохранить». Django сначала записывает его в базу (появляется id), затем срабатывает метод save(), который вызывает generate_qr(). Тот, используя библиотеку qrcode, создает PNG-изображение, кладет его в буфер и сохраняет в поле qr_code. В папке media/qrcodes/ появляется файл item_15.png. Всё. Теперь его можно распечатать на стикере.

«Где чёртов паспорт?»: Как я победил домашний хаос с Django и QR.

🌌 Фича 2: Админка, от которой не хочется плакать Стандартная админка Django функциональна, но выглядит так, будто её дизайнер застрял в 2010-м. Для внутреннего удовольствия я взял Django Unfold — современную тему для админ-панели. Установка: pip install django-unfold. Добавление в INSTALLED_APPS. И вуаля:

# admin.py from unfold.admin import ModelAdmin @admin.register(Item) class ItemAdmin(ModelAdmin): list_display = ['name', 'location', 'box', 'qr_preview'] list_filter = ['box', 'location'] search_fields = ['name', 'notes'] def qr_preview(self, obj): from django.utils.html import format_html if obj.qr_code: return format_html('<img src="{}" width="50" />', obj.qr_code.url) return "-" qr_preview.short_description = "QR"
Теперь админка имеет тёмную/светлую тему, красивые компоненты, удобные фильтры. Это не must have, но это cheat code для того, чтобы работать с данными было приятно. Иногда мелочи решают.
Теперь админка имеет тёмную/светлую тему, красивые компоненты, удобные фильтры. Это не must have, но это cheat code для того, чтобы работать с данными было приятно. Иногда мелочи решают.

🌌 Фича 3: Сканируем с телефона без приложений Вот где происходит магия для конечного пользователя (меня или моей жены). Я создал отдельное представление (view) и шаблон c простой страницей. Суть scanner.html:

<div id="qr-reader" style="width: 100%;"></div> <div id="qr-reader-results"></div> <script src="https://unpkg.com/html5-qrcode@2.3.8/html5-qrcode.min.js"></script> <script> const scanner = new Html5QrcodeScanner("qr-reader", { fps: 10, qrbox: { width: 250, height: 250 } }); function onScanSuccess(decodedText, decodedResult) { // decodedText — это тот URL, который мы зашили в QR // Просто перенаправляем пользователя на него! window.location.href = decodedText; } scanner.render(onScanSuccess); </script>

Как это работает «под капотом»: Библиотека html5-qrcode через API MediaDevices браузера получает доступ к камере. Она захватывает видеопоток и в реальном времени анализирует каждый кадр, ища QR-код. Как только находит — декодирует его в URL и перенаправляет тебя прямо на страницу с описанием вещи. Никаких лишних действий. Разве это не чудо? Современный браузер — это мощнейшая среда выполнения, и грех этим не пользоваться.

🎯 Фича 4: API за 5 минут для будущих интеграций Вдруг я захочу сделать Telegram-бота, который по фото QR-кода будет выдавать информацию? Или мобильное приложение на React Native? Для этого нужен API. Вместо громоздкого Django REST Framework я выбрал лёгкий и быстрый Django Ninja. Почему Ninja? Синтаксис как у FastAPI (который она и использует внутри), валидация через Pydantic, автодокументация (Swagger/OpenAPI).

# api.py from ninja import NinjaAPI, Schema from .models import Item api = NinjaAPI(title="HomeInventory API") class ItemSchema(Schema): id: int name: str location: str qr_code_url: str = None @api.get("/items/{item_id}", response=ItemSchema) def get_item(request, item_id: int): item = get_object_or_404(Item, id=item_id) return item

Всё. Теперь по адресу /api/docs у меня красивая интерактивная документация, где можно протестировать все эндпоинты. На создание полноценного API ушло 15 минут.

«Где чёртов паспорт?»: Как я победил домашний хаос с Django и QR.

Часть 3: Из игрушки в реальный инструмент — кейсы

Проект перестал быть игрушкой, когда я начал его использовать.

  • Кейс «Переезд»: Я распечатал QR-коды на листах А4 формата «стикер», нарезал и наклеил на каждую коробку. Грузчики выгружали коробки в новую квартиру, я ходил с телефоном, сканировал и сразу говорил: «эту — на кухню, эту — в кабинет, эту — в кладовку». Распаковка стала квестом, а не кошмаром.
  • Кейс «Семейный архив»: Бабушкины фотоальбомы, детские рисунки. На коробке QR-код. Отсканировал — вижу описание: «Альбом №3. 1985-1990 гг. Лето на даче, выпускной мамы». Теперь любой родственник может найти нужное, не перерывая всё.
  • Кейс «Гаражная мастерская»: Инструменты, краски, запчасти. QR-код на ящике или полке. Быстро находишь нужную отвёртку или смотришь, сколько осталось моторного масла. История использований (кто брал, когда) — в планах.

🧰 Выводы, которые я вынес и которые могут быть тебе полезны.

  1. MVP — это просто. Не нужно сразу делать сложную систему с уведомлениями и машинным обучением. CRUD (Create, Read, Update, Delete) — уже мощный инструмент. Сначала заставь это работать для одного сценария.
  2. Инструменты имеют значение. Правильно выбрав Django с его «батарейками», я сэкономил кучу времени на написании базовых вещей. Unfold и Ninja сделали опыт разработки приятнее.
  3. Физический мир любит цифру. QR-код — это мост между ними. Это дешёвый, надёжный и универсальный якорь для информации.
  4. Личные проекты — лучший полигон. Здесь можно попробовать новые библиотеки, отточить навыки и решить свою реальную проблему. Это мотивирует больше любого учебного задания.

Мой код не претендует на архитектурную гениальность, но он работает и уже приносит пользу. И это главное.

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

🧩Там же в README есть инструкция по запуску.

git clone https://github.com/Artem7898/homeinventory.git cd homeinventory python -m venv venv source venv/bin/activate # или venv\Scripts\activate на Windows pip install -r requirements.txt python manage.py migrate python manage.py runserver

И ты уже в деле.

🙌 А ты как борешься с хаосом, цифровым или физическим? Используешь подобные пет-проекты для решения бытовых задач? Делись в комментариях — очень интересно услышать твои лайфхаки и идеи! Если материал был полезен, буду рад подписки лайку — это лучший сигнал, что стоит делать такие разборы дальше. Удачи в твоих проектах!

1
2 комментария