• Django Admin как вывести ссылки?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Django
    Седой и строгий
    Любое из полей ModelAdmin может быть функцией, формирующей всё, что заблагорассудится. Кусок из моего кода:
    @admin.register(Order)
    class OrderAdmin(admin.ModelAdmin):
        list_display = ('__str__', 'customer_link')
    
        def customer_link(self, obj):
            if obj.customer:
                return u'<a href="{0}">{1}</a>'.format(reverse('admin:auth_user_change', args=(obj.customer.pk,)), obj.customer)
            else:
                return obj.customer_fio
        customer_link.allow_tags = True
        customer_link.admin_order_field = 'customer'
        customer_link.short_description = Order._meta.get_field('customer').verbose_name.title()

    И для пущей наглядности кусок модели Order:
    @python_2_unicode_compatible
    class Order(models.Model):
        customer = models.ForeignKey(User, verbose_name=u'Заказчик', null=True, blank=True, related_name='orders')
        customer_fio = models.CharField(u'ФИО заказчика', max_length=150)
    Ответ написан
    Комментировать
  • Почему сейчас во всех вакансиях стали просить class-based view в Django?

    @deliro
    Выигрыша по производительности действительно нет, т.к. CBV превращаются в обычную вьюху.
    Выигрыш по скорости разработки есть, т.к. в generic описано достаточно много типовых вьюх (ListView, DetailView, FormView). Код в CBV более структурирован, особенно, если вьюха принимает сразу несколько методов (POST, GET, ...). Количество кода также сокращается за счёт использования самих CBV и миксинов.
    Ответ написан
    Комментировать
  • Зачем нужен Dependency Injection в Android разработке?

    artemgapchenko
    @artemgapchenko
    Начать неплохо бы с понимания того, что такое DI. Обратимся к википедии:

    Внедрение зависимости (англ. Dependency injection, DI) — процесс предоставления внешней зависимости программному компоненту.

    Если выражаться не канцеляритом, а обычным русским языком, то DI - это когда вы своему компоненту (например, классу) предоставляете нужные для него зависимости извне, а не создаете их сами в конструкторе, или через инициализацию в месте объявления поля. То есть не так:

    public class Api {
    	....
    	private final HttpClient client = new OkClient();
    }

    А, например, так:

    public class Api {
    	....
    	private final HttpClient client;
    
    	public Api(@NonNull HttpClient client) {
    		this.client = client;
    	}
    }


    И что нам это даёт?

    Ну, очевидно, нам теперь проще менять зависимости. Нужна вам другая реализация абстрактного класса HttpClient - взяли, и передали её через конструктор, или через метод-setter. В случае с первым куском кода, вам пришлось бы ещё и класс Api переписывать, что в случаях, отличных от тривиальных, может привести к ошибкам. Получается, что ваш класс теперь закрыт от изменений (смотрим Open/Closed Principle).

    Окей, а на практике-то какие бенефиты?

    Во-первых, вы теперь можете написать инициализацию вашей программы через конфигурационные файлы. Скажем, на старте будет читаться простенький текстовый файл, который определяет, какой httpclient использовать, какие настройки доступа к бд применять и так далее, и, исходя из этого, будут определяться зависимости.
    Во-вторых, вам теперь существенно проще писать тесты. Написали вы, скажем, какой-нибудь парсер, который принимает InputStream, содержащий в себе данные json-объекта, как-то хитро его парсит, и выдаёт вам объект вашей бизнес-модели. В приложении этот парсер будет принимать на вход реализацию InputStream'а, которая берёт данные из сети, а в тестах - реализацию, которая просто читает файл с диска (потому что тесты должны выполняться часто и быстро, и ваша задача в тесте - протестировать ваш парсер, а не скорость сетевого соединения).

    Вот, в общем-то, и всё. А Dagger - это просто библиотека, которая автоматизирует ручное внедрение зависимостей, равно как и другие DI-библиотеки.

    P.S. В некоторых случаях чрезмерное увлечение DI может привести к нежелательным эффектам, вроде чрезмерного усложнения кода, поэтому внедряйте аккуратно. Понимание приходит с опытом.
    Ответ написан
    Комментировать
  • Хорошая практика для Python?

    aRegius
    @aRegius
    Python Enthusiast
    Здравствуйте!

    Лутца читать лучше после Доусона. А вот читая Доусона, вы и сделаете первый шаг к тому, чтобы не "тупить в экран", если, конечно, подойдете к работе (именно работе, а не просто чтению) с этой книгой серьезно - там достаточное количество интересных и практичных задач.
    Ответ написан
    4 комментария
  • Какой планировщик вы используете?

    @vashaaa
    Юх с горы
    А жить то когда ?) но если вам таки нужно, то хватит дисциплины и клочка бумаги со списком дел на день, составленым вечером. С разделением, на очень важные и вторичные. Тогда выстроете себе минимум работы на день (первичные дела) и максимум (первичные +вторичные). И будете максимально продуктивны. Это разделение нужно так как не всегда выходит так как хочется. Все таки жизнь) удачи.
    Ответ написан
    Комментировать
  • Как реализовать динамическое изменение класса в C#?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Если я правильно понимаю, то вы про полиморфизм)
    Что-то вроде:

    // Каждая локаль должна иметь в себе словарь с переводами
    public interface class ILocale {
        Dictionary<string, string> Translation { get; }
    }
    
    // реализации разных локалей
    public class English : ILocale {
        public Dictionary<string, string> Translation {get; set;} = new Dictionary<string, string> {
            ["test"] = "Test"
        };
    }
    public class Russian : ILocale {
        public Dictionary<string, string> Translation {get; set;}  = new Dictionary<string, string> {
            ["test"] = "Тест"
        };
    }
    public class Ukrainian : ILocale {
        public Dictionary<string, string> Translation {get; set;}  = new Dictionary<string, string> {
            ["test"] = "Тест"
        };
    }
    public class Kazakh : ILocale{
        public Dictionary<string, string> Translation {get; set;} = new Dictionary<string, string> {
            ["test"] = "Сынақ"
        };
    }

    И, допустим, читаем из какого-то конфига:
    namespace TestLib{
        class Program {        
            static void Main(string[] args) {
                ILocale locale = GetLocale();
                WriteLine(locale.Translation["test"]);
                ReadKey();
            }
        }
    
        private static ILocale GetLocale() {
            // Мы можем получать ее динамически из конфига
            // но вызывающий код знает лишь, что это будет некая локаль, но какая
            // точно - неизвестно
            return Configuration.GetLocaleFromXml(); // псевдокод
        }
    }
    Ответ написан
    2 комментария
  • Есть ли ляпы в коде?

    In4in
    @In4in
    °•× JavaScript Developer ^_^ ו°
    Одна логическая ошибка в коде точно есть. Объясню ее на примере.

    function setHandler(el){
    
       var obj = new MyController(el);
    
      $(el).on("click", function hand(){
          alert(obj.name);
      });
    
    }
    
    setHandler(element1);
    setHandler(element2);


    После выполнения данного кода в память браузера попадают:
    • Функция setHandler
    • Два объекта типа MyController
    • Две функции hand - обработчики события onclick.


    Да-да, для каждого вызова setHandler создается своя функция hand. Две (три, десять или даже миллион) разные функции с одинаковым телом. Все, что их отличает - область видимости, в которой они объявлены (к примеру, внутри каждой из них доступен свой obj).

    Но, спрашивается, как мы можем оптимизировать потребление памяти в данной ситуации? А вот так:

    function hand(){
    
      var obj = $(this).data("obj");
    
      alert(obj.name);
    
    }
    
    function setHandler(el){
    
       var obj = new MyController(el);
    
      $(el)
        .data("obj", obj) //Как вариант
        .on("click", hand)
      ;
    
    }
    
    setHandler(element1);
    setHandler(element2);

    Вынесем hand в более высокую область видимости.

    Теперь в памяти сохранены:
    • Функция setHandler
    • Функция hand
    • Два объекта MyController
    Ответ написан
    7 комментариев
  • Как составить план обучения на ближайшиее время?

    aRegius
    @aRegius
    Python Enthusiast
    Добрый день, Дмитрий.

    1. В такой последовательности:
    Python
    a) Майкл Доусон - рус ... eng
    b) Марк Лутц - рус ... eng
    c) Дэвид Бизли + Лучано Рамальо
    Дальше - самостоятельный выбор, исходя из личных потребностей.
    Django
    a) Джейкоб-Каплан Мосс и Адриан Головатый - рус ... eng
    b) Django Girls Tutorial
    c) Гринфилды + Равиндран

    Параллельно читаем Django documentation

    2. HTML5 + CSS3 + JS + SQL.
    Знать на уровне, достаточном для реализации собственного проекта с нуля (скажем, свой сайт). Для этого, правда, достаточно HTML и CSS, в объеме указанных книг. Другой вопрос, что и JS, и SQL практически всегда требуются в багаже знаний при устройстве на работу (достаточно посмотреть вакансии).

    3. Нет, просто нету смысла. Актуальной качественной литературы по Python хватает. Есть некоторые исключения (некоторые из них мною упомянуты), но в целом, повторюсь, с современной литературой у Python все в полном порядке. Ищите на Amazon, сортируя по дате выхода.
    Ответ написан
    9 комментариев
  • Как составить план обучения на ближайшиее время?

    @JuniorNoobie
    Сижу в поддержке, пишу мелкие проекты
    Смотря что вы хотите. Есть разделение на frontend, backend, database. Есть технологии (фреймворки, библиотеки), лежащие на стыке этих трех "китов". Есть различный инструментарий для работы. Я бы рекомендовал начать ознакомление с web-разработкой с основ: HTML, CSS, базовый JavaSript. Попутно нужно читать про различные протоколы (в основном, интересуют транспортные: HTTP, UDP, FTP). Как работает браузер, сервер, какие спецификации сейчас в ходу. Затем начните изучать серверную сторону вопроса: язык, web сервер, деплой приложения. Можно также начать изучать основы Баз данных: на уровне создания/редактирования/удаления таблиц/процедур, добавления данных. Получив базовые знания, можете начинать изучать библиотеки/фреймворки на стыке технологий. Здесь такое раздолье, что даже изучая какую-то одну вещь вы можете никогда не изучить ее до конца по ряду различных причин.
    Вот я лично сейчас изучаю такой стек:
    HTML, CSS, Javascript
    Jquery(Javascript), Bootstrap(Javascript+CSS), LESS(препроцессор CSS)
    C#, MVC (паттерн), Entity Framework (DB+C#, ORM)
    MS SQL, ORACLE (DB)
    Из инструментов: Git/SVN, VS 2013, Notepad++, Photoshop.

    В-общем, сначала база, алгоритмы, потом библиотеки/фреймворки. Если начать с фреймворков, то все равно рано или поздно вы вернетесь к "а как же эта штука работает?"...
    Ответ написан
    Комментировать
  • Что изучать после Битрикса для фриланса за рубежом?

    opium
    @opium
    Просто люблю качественно работать
    рынок интернет магазинов на западе подмял под себя magento а он на php zend mysql
    Ответ написан
    Комментировать
  • Как подготовиться к закону Яровой?

    @nirvimel
    1. Купите недорогой VPS (от $15/год, можно даже дешевле) и поднимите на нем личный VPN. В Сети есть куча подробных руководств как это делается. Только не надо говорить, что у вас нет на это денег, интернетом вы же не бесплатно пользуетесь. Просто примите это как небольшую дополнительную плату за интернет за ваш спокойный сон.
    2. Работая через VPN (обязательно), заведите себе новый почтовый ящик на зарубежном сервере у компании, у которой нет никакого бизнеса и любых коммерческих интересов в РФ. Пусть это будет не мажорный гигант индустрии, а скромная компания, малоизвестная в РФ. Главное - это наличие SSL в веб-интерфейсе и в IMAP, в остальном почта есть почта, она просто работает, и этого достаточно.
    3. Работая через VPN, заведите себе новый аккаунт в vk facebook и/или google (если вы неспособны полностью отказаться от использования социалок). При регистрации указывайте место проживания подальше от РФ. Учитывайте, что все гиганты индустрии, имеющие большой бизнес в РФ, полностью сотрудничает с ГБ, но аккаунты нерезидентов, зарегистрированные и посещаемые с зарубежных IP, они не станут сливать по умолчанию (но по первому запросу сольют мгновенно). Так что забудьте про любые приваты в социалках, ведите все общение так, как будто все это читает весь ваш квартал и все те, кому бы вам меньше всего хотелось это показывать. Для приватного общения пользуйтесь только безопасной почтой (пункт 2) и защищенными чатами, на telegram jabber на зарубежных серверах. Все это касается только тех, кто не может окончательно завязать с пагубной зависимостью от соц.сетей. Очевидно, наиболее безопасным (и полезным для здоровья) вариантом является полный отказ от социалок.
    4. Не вбрасывайте в старые ящики и соц.аккаунты адреса и ссылки на новые чистые, не указывайте новые адреса в любых исходящих и старайтесь, чтобы они не попали во входящие. Помните, что в любой социалке и любом веб-интерфейсе почты (сотрудничающей) кнопка "удалить" скрывает удаляемое только от вас самих и не более того.
    5. (Самый неприятный пункт) Забудьте про vk, mail.ru и российские gmail и facebook. - КАК? - Так! Я понимаю, что это не легко, что они давно стали частью вашей жизни. Но это придется сделать! Поговорите сами с собой, спросите себя что для вас важнее: ваша личная безопасность, спокойствие и крепкий сон или старые привычки, которыми вы опутаны, и которые не хотят отпускать вас? Учтите, что продолжая пользоваться местными социалками (и сотрудничающими иностранными), вы продолжаете каждый день генерировать на себя тонны компромата, который может обернуться против вас в самый неожиданный момент самым неприятным образом. Проявляя активность в своих старых аккаунтах, вы не даете им "протухнуть" и не даете даже формального повода добрым компаниям снести их через пол года, после истечения отведенного законом срока хранения (как известно, vk не ограничивается минимальным сроком хранения, а хранит все метаданные и текст практически вечно за исключением видео/аудио).
    Ответ написан
    26 комментариев
  • Стоит ли продолжать изучать Android develop?

    vaux
    @vaux
    Курящий лыжник
    Освойте сначала что-то одно на приличном уровне, а уже потом будете гнаться за трендами, следить за выходом новых технологий и т.п. В первую очередь вам нужна база: алгоритмы, структуры данных, понимание ООП, знание паттернов, TDD и т.д. Потом вам нужен опыт программирования. Чем больше вы пишите, тем больше понимания того, что вы делаете. Устройтесь джуном в контору, где над вами будет стоять опытный сеньер или тимлид. В конторе обязательно должен практиковаться code review, где ваш код будут разбирать и указывать на ошибки и спорные моменты. C++ и андроид не исчезнут в одночасье, можете спокойно развиваться в том, что вам интересно. А технологии рождаются и умирают. Это нормально и вам с этим жить, если решили стать программистом. Вам постоянно придется изучать что-то новое, но для начала освойте что-то одно на хорошем уровне.

    Более того. Если вы программист, то вы в первую очередь software engineer. Вам не должно быть дела до языка или технологии. Это всё вторично, потому что вы должны знать всё. Вам дали задачу, вы выбрали наиболее подходящий инструмент и решили эту задачу. К этому нужно стремиться.
    Ответ написан
    1 комментарий
  • Какие плагины использовать веб разработчику в sublime text 3?

    Extremum
    @Extremum
    Человек спросил про Sublime, ему в ответ IDE. А если через FTP только доступ есть и надо файл стилей поправить, тоже запускать PHPStorm?

    По теме лично я юзаю: Emmet, Git, AutoFileName, ColorPicker, Sublime SFTP
    Ответ написан
    11 комментариев
  • Как увеличить скорость разработки и внимательность?

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    Скорость работы штука мутная и неоднозначная. Давно установлено как факт, что мозг может одновременно хранить в сознании 7+-2 объекта, т.е. от 5 до 9, в зависимости от кучи факторов. Все что свыше того, нужно как-то хитро организовать, иначе получится каша. Да и продуктивно напрягать мозг больше 4-5 часов в сутки в совокупности могут только продвинутые джедаи...

    Любая работа любого программиста начинается с построения модели приложения/модуля, над которым предстоит поработать. В этом процессе немаловажным звеном является моделирование потоков входящих и исходящих данных.

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

    В процессе простраивания архитектуры заодно всплывают все сопутствующие технологии, и возможно неоднократное пересматривание как модели так и архитектуры, т.к. это вещи взаимосвязанные.

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

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

    Далее в процессе реализации обязательно будет прибегать манагер с новыми прорывными идеями, и вещать, что это же мелочь, ерунда и вообще. На самом деле такой манагер дилетант, а проекту грозит слив (срыв сроков, бюджета и пр.), причем виноватым станет ответственный разработчик...

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

    Джуну обычно сливают что-то, с одной стороны несрочное и не ключевое, с другой стороны на чем он может учиться. Ясен-прекрасен, что у джуна в голове всех этих хитросплетений нет и он носится как курица с писаной торбой со своим модулем/классом.

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

    Вторая рекомендация осознать, что джун - это такой ремесленник-подмастерье, который делает кирпичи руками, как правило медленно и криво.

    Пол-года это очень мало, особенно если до того вообще разработкой не занимался. Для полноценного усвоения контекстов и выработки начального уровня мастерства необходимо набрать хотя бы пару-тройку тысяч часов яростного дебаггинга - ценнейший пласт знаний о том, как не надо делать. :) Тогда уже нутром будешь чуять, где могли затаиться баги, куда рыть и вообще. Я на заре своего пути, помнится, однажды часов 20 не мог понять, что недопоставил одну единственную запятую...

    Третья рекомендация - писать код лаконично, чтобы функции/методы целиком влезали в один экран. Причем писать функции/методы с единственной ответственностью, и стараться максимум из них делать чистыми (никаких глобальных переменных и состояний, только аргументы). Такой код и читать/воспринимать на порядки проще, и тестировать, и отлаживать.

    Четвертая рекомендация - постоянно прокачивать скиллы, много читать доки, вникать, задавать много вопросов и искать на них ответы, и пробовать все на практике. Критерий истины - практика.

    То, что джун не шибко быстр - это нормально, до 70% времени джун должен штудировать доки, из оставшихся 30%, до 95% времени - это дебаггинг. :) Так-что на реальный дев остается не так много времени, 0.3*0.05...

    Понятно, что в идеале джун должен этим заниматься не только в рабочее, но и в свое свободное время. Когда я вгрызался в основы, я мог маньячить по 12-16 часов в сутки, без праздников, выходных и каникул. Благо обстоятельства позволяли...

    И, главное, терпение+усидчивость. Путь это нелегкий, не простой, учиться придется постоянно, и постоянно будут критиковать, что мог бы поточнее, побыстрее, побольше и подешевле.... :)
    Ответ написан
    Комментировать
  • Как получить первую работу на upwork?

    opium
    @opium
    Просто люблю качественно работать
    нахрена вы пишите как вас зовут если это так видно из вашего профиля
    нахрена вы пишите про свой пояс тем самым вы отталкиваете 100% клиентов так как часовой пояс от них отличается от американского на 9 часов
    квик про таск может быть хорошо так как вы не написали что в него пишите

    а вот это нахрена ?

    and I am ready to explore deeper on interviews.

    I am very intrested in this project because I like to program in *.net, java*.

    In my profile, you can see more info about me.

    Kind regards.

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

    буквально вчера мне написал дотнетчик
    наш разговор в феврале

    Игорь
    Привет! (имени, увы, не знаю)
    Ссылку нашел на тостере. Правильно ли я понял, что работая в Тае, ты можешь предложить какие-то удаленные вакансии/фриланс?
    03.02.16

    Puma
    А что умеешь и по чем?
    04.02.16

    Игорь
    В первую очередь C# .net, больше опыта на Desktop (WPF), расту в ASP.NET. Могу и С++. Есть вообще что-то удаленное по таким технологиям? По цене - для начала 15$
    04.02.16

    Puma
    Не мой профиль
    04.02.16
    А так на апворке куча работы

    Игорь
    Для .net куча?
    04.02.16

    Puma
    Да
    04.02.16
    Недавно только дотнет приложения разворачивал

    Игорь
    отлично) думал, что с .net можно об удаленке и не мечтать. Спасибо, поищу

    А вот десятого августа, прошло по сути 6 месяцев

    Игорь
    Доброго времени)
    С нашего последнего разговора многое произошло, я сделал 3 проекта на UpWork, побывал на Самуи, и решил туда переехать. Поможете парой советов?
    10.08.16

    Puma
    Помогу
    10.08.16

    Игорь
    На Самуи интернет нормальный (видео-скайп, remote desktop) реально пробить?
    10.08.16
    и второй вопрос, вот это за 20 тыс бат - дорого? Мне надо жилье найти, я пока не в теме вообще:
    Ответ написан
    2 комментария
  • Как получить первую работу на upwork?

    lunaticman
    @lunaticman
    Дерзкий айтишник
    Привет.

    Я успешно забустил свой профайл на Апворке до 80 баксов в час (сейчас я уже апворком не пользуюсь), порекомендовал свою систему други друзьям которые удачно нашли проекты потом. Поэтому постараюсь коротенько объяснить:

    - Первый проект тяжелее всего найти, я искал около месяца.
    - Нужно искать что-то "безопасное", проект который не займет у вас много времени и которые вы уверены что сделаете.
    - Советую даже не думать о почасовых работах, шанс крайне маленький.
    - Если у вас есть возможность, попросите кого то из существующих клиентов нанять вас (либо просто дайте им сто баксов, чтобы они вам якобы оплатили вашу работу).
    - На апворке есть несколько "прайм таймов" - периоды в которые появляются новая работа, я обычно мониторил работу пару часов в день. Не стоит тратить на "охоту" много времени. :)
    - Отказаться от любых шаблонов письм, я рекомендую как наниматель , шаблонные письма видно сразу - доверия не вызывает.
    - Попробуйте записать видео в качестве cover letter - только это вам поможет выгодно отличится в ряду других кандитатов
    - Выделите самые важные элементы в предложении о работе и объясните как вы их хотите изящно решить. В конце предложите обсудить все требования, задайте какие-то наводящие вопросы, дайте советы (нужно чтобы ваш клиент, узнал что-то новое от вас). То что вы сразу по описанию составляете план работ и архитектуру - без каких-либо уточнений и вопросов - звучит крайне фантастично.
    Ответ написан
    21 комментарий
  • Программирование с ноля. Не студенческий возраст. С чего начать?

    Итак, раз для домашнего пользования, то Java лучше отложить. В принципе они примерно равны с C# по весовой категории и областям применения, но ИМХО на Шарпе проще набросать какое-нибудь десктопное приложение. Для написания десктопной карточной игры вполне подходящий вариант.

    Для Ардуино понадобится C/C++, это вам правильно говорят. По сравнению с C# синтаксис похож, но различаются многие концепции, C++ и тем более Си значительно ближе к железу.

    Играю семь бубей!
    Ответ написан
    1 комментарий
  • Что выбрать для углубления знаний (backend)?

    @Bojczuk
    Оставайся в дотнете. Переход в указанные области я бы посчитал шагом назад во всех смыслах.

    Если работаешь на работе, которая не мотивирует развиваться и делать что-то сверх нормы, поменяй её, здесь не в языке проблема.
    Ответ написан
    1 комментарий
  • Выучил базовые основы Python 3. Куда копать дальше?

    werevolff
    @werevolff
    Если для Web, то Django + Scrapy. На scrapy можно сразу начинать делать парсеры. Парсеры нужны очень часто, и можно сразу брать проект и делать. Для десктопа и кроссплатформенности - не знаю. Возможно, что Kivy.

    Да, чуть не забыл: Peewee. Можно и SQLAlchemy, но pewee выглядит очень изящно.
    Ответ написан
    5 комментариев