Рубрики
Без рубрики

Итак, я построил приложение Django

Фон этот проект начал, когда я работал, завершив первый квартал 2020 года на работе, и у нас был … Tagged с Django, Python, Development, Beginters.

Фон

Этот проект начался, когда я работал, завершив первый квартал 2020 года на работе, и у нас было много очень «быстрого огня» от наших клиентов. Эти изменения вызвали несколько изменений в документы проектирования решений. Эти дизайнерские документы являются частью моих обязанностей в качестве инженера по продажам над продуктом, над которым я работаю (моя компания производит несколько различных продуктов). Каждый раз, когда клиент, или внутренне, мы что-то меняли, мне нужно было бы вернуться через мои другие «в полете» (то есть клиент еще не подписал SOW), чтобы обновить документы по дизайну решения, чтобы поднять их до последний и лучший «шаблон». Я использую слово «шаблон» свободно, как то, из чего состоит шаблон, является последней версией документа «Дизайн решения» («SDD») в формате MS Word, с выделенными блоками текста, которые будут заменены соответствующей информацией для следующего клиента (Имя, заголовок решения и т. Д.).

Неэффективность этого процесса для изменений – только начало, потому что мы должны сначала создать его, чтобы изменить его. Чтобы создать документ, может потребоваться час или два, чтобы добавить соответствующие биты данных, добавить на серверы (для локального решения), а затем отправить его для внутреннего обзора от служб и команды SOW. У них неизбежно есть изменения, которые они хотят внести, часто это язык, а не технический (но иногда это может быть). Это заставляет меня переработать SDD, а затем повторно его для одобрения. Часто эти изменения хороши, они служат цели (независимо от того, являются ли они внутренними или ориентированы на клиента), так что это не жалоба на это. Просто переработка, которая должна быть связана с несколькими сделками, которые становятся утомительными.

Я подумал о себе (я), должен быть лучший способ сделать это, конечно, это не вершина эффективности, верно? Мне пришло в голову, что реальная проблема заключается в том, что в этом сценарии у нас есть два потока информации: (1) Данные, попадающие в документ, состоящие из деталей решения, технических характеристик и т. Д. И (2) сам язык шаблона. Оба сосуществуют в словах DOC одновременно, что означает, что если я обновляю один, я обновляю другое, тем самым вынуждая переделку на другие сделки. Я также подумал, что, если бы я мог держать оба потока отделенными, пока мне не понадобится THM, чтобы присоединиться (глядя на область решения, обновление дизайна решения или экспорт в файл)? Затем я мог бы обновить поток шаблонов, чтобы исправить проблемы формулировки или обновить решение, и мне не нужно перерабатывать вещи для других сделок … Ну, технически, я все еще делаю, но держу эту мысль.

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

  1. Я не профессиональный разработчик, у меня есть степень CS (Go Comets!, О которой вы, вероятно, никогда не слышали, то это талисман UT Dallas), но на самом деле не использовал его. Я приехал из долгого опыта ИТ и обнаружил, что получение степени на самом деле мало что сделало для меня в карьере (конечно, кроме долга по студенческому кредиту), но открыл дверь у моего нынешнего работодателя, что мне было бы запрещено не иметь Это. Короче говоря, я в роли продаж, где степень снова ничего не делает (LOL). Тем не менее, это дало мне навыки, чтобы критически смотреться на проблему и придумать некоторые идеи о том, как ее решить. Поэтому, хотя я не могу кодировать для дерьма (посмотрите на мой исходный код, вы увидите), у меня есть эти разработчики, и я могу видеть проблемы таким образом.
  2. Мои навыки на питоне самоучка, я прошел некоторые курсы Udemy и играл с Python … Чувак, какой отличный язык научиться кодировать или научиться кодировать после многих лет, если он не делал этого.
  3. Я наткнулся на Джанго после Googling (теперь это глагол, верно?) Вокруг рамки (чтобы я мог быть несколько ленивым и не строить все с нуля). После некоторого чтения и поиска с огромным количеством доступных учебных пособий, обнаружил, что это фантастическое подходит для этого проекта, и приступил к созданию прототипа. После долгих времен, проведенных в Googling и поиска переполнения стека (на самом деле, что бы я сделал без этого сайта!), Я работал по прототипу. Кстати, это было бы намного проще, если бы я только что купил книгу начинающих Винсента и начала там. Вместо этого Я закупил жесткую копию его книги профессионалов, и это здорово!

Репо Здесь , Дайте знать, если у вас появятся вопросы.

Итак, о каком это решение я говорю?

Это элементарное, мой дорогой Уотсон! Я использовал отличную структуру Django для создания структуры базы данных (моделей), представления для перевода информации о базе данных в шаблоны (веб -часть), так что я могу иметь свои два потока, сохранившихся, но можно соединить вместе, когда это необходимо Анкет Это похоже на это:

Модель -> Просмотр -> Шаблон -> PDF

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

Модель

Позвольте мне показать вам саму модель, чтобы вы могли понять:

В классе документов есть только пара столбцов (я думаю, что это поля вызова, но, поскольку они переводят в столбцы в таблице БД, вот как я думаю о них):

  • Имя-довольно эксплуатационное, хотя я пытался использовать простое имя повсюду, чтобы оно было очень общим и могло бы использоваться для любого проекта, или можно просто переименовать его в более конкретном или соответствии с надлежащим именом Конвенции
  • Резюме – Как следует из названия, это текстовое поле, где вы можете поместить все резюме решения. Наши, как правило, 2 абзаца, но это, вероятно, можно использовать для хранения гораздо большего. Если вы пишете книгу, я предполагаю, что Textfield имеет некоторые ограничения, возможно, разумно разделить ее на разделы или что -то в этом роде … опять же, это работает для меня.
  • Клиент, продукт и инженер – это отношения иностранных ключей, что является отличной особенностью в Django. Если я знаю, что будет только единое значение для продукта, инженера и клиента, то это правильные отношения, и очень легко реализовать. Спасибо, Джанго!

Остальная часть класса – это довольно Coilerplate Django, убедившись, что он правильно отображается в списках, с правильным именем, и обратный URL для работы со значением индекса и для целей тестирования.

Вот диаграмма UML для файла моделей.py, так что вы можете увидеть, как он выглядит.

Как вы можете видеть, отношения иностранного ключа по существу создают звездную схему в структуре таблицы баз данных. Так что основная таблица, в данном случае Document.Models. Документ имеет отношения через ID полей с документом. Модель. Продукт, инженер и клиент. Это элегантно и легко обернуть голову.

Модели для продукта, инженера и клиента очень просты, они – просто поле «Имя», поэтому я не буду вдаваться в подробности здесь. Но это может быть расширено, чтобы включить другие области, которые могут быть полезны для вашей модели. Примеры могут включать в себя: клиент может иметь адресные поля, контактную информацию, сумму прошлых сделок и т. Д. Продукт может включать подробную информацию о продукте, таких как семья, линия бизнеса («LOB») и т. Д. Небо – это предел здесь, мой вариант использования, что породило это грандиозное приключение, было немного более сложным, чем эта общая версия. У меня были подробности о серверах, линии бизнеса, подробностях клиентов и т. Д. Но я чувствую, что это хорошая стартовая местность, чтобы мяч катился и выделил его по мере необходимости.

Вид

Взгляды Джанго на самом деле или, скажем, могут быть очень простыми. В итоге я использовал общие представления (ListView, Templateview, DetailView и создание/обновление представлений). Это делает мои классы просмотра супер простыми, чистыми и простыми для понимания. Например:

В этой точке зрения я установил модель в качестве моей основной модели, в данном случае документ. Я установил имя файла шаблона (под папкой проекта> шаблоны> документ> detail.html), и для некоторых представлений, где я хочу показать детали, или список дизайнов решений, я включаю коллекцию всех документов Объекты return document.objects.all () , который обеспечивает набор запросов. Эти представления довольно простые и не допускают большого количества настройки без переоценки или использования forms.py Чтобы сделать некоторую настройку представления. Например, у меня есть в своем первоначальном проекте, многие ко многим отношениям с некоторыми другими таблицами, и я хочу показать все выбранные переменные. Поскольку я хотел показать их в виде флажков, которые либо проверяются (выбраны), либо не контролированы (не выбраны), чтобы сделать это, чтобы создать forms.py Файл для переопределения виджета по умолчанию. Для целей этого приложения я держал вещи как «запасы» Django, насколько это возможно, для простоты понимания и реализации. Вы можете сделать так много, чтобы настроить внешний вид, поверьте мне, история моего браузера полна поисков.

Пара интересных просмотров приходит из -за моего использования django-weasyprint , и я вытащил представления прямо со своей страницы GitHub.

Вы можете найти код Здесь Виды, перечисленные в коде, работали в значительной степени из коробки. Я немного подправлял их, чтобы заставить их работать, но в остальном в значительной степени подключаться и играть. Первый класс MyModelPrintView Позволяет вам установить пользовательский класс ответов для получения URL -адреса, я не беспокоился об этом подходе. Главным образом потому, что я не понимал, что такое вариант использования, поэтому я пропустил его. Кроме того, я смог заставить свое решение работать, так зачем беспокоиться? DocumentDowLoadView Класс – это то, что вызывает мой вход в путь моего URLS, и выплевывает PDF -загрузку в мой браузер, в данном случае по умолчанию, по умолчанию, именем document_export.pdf Анкет Если бы я хотел использовать PNG вместо PDF, я мог бы вызвать DocumentImageView Вместо этого класс, но PDF в порядке для этого решения.

Шаблон

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

Шаблон PDF, который показывает детали и выплевывает данные в файле PDF, показан ниже:

Я расширяю _base.html Чтобы дать мне центральное место, чтобы установить начальную загрузку 4 и немного общего CSS GOOD. Я в основном использую Bootstrap 4 OOTB, здесь ничего не может. Я включил звонок на таблицу стиля, но это никуда не денется. Есть несколько хороших учебных пособий по HTML -PDF для печати, которые должны дать вам хорошие параметры CSS для использования (пример – это страница это сработало, как это показало). Я провел много времени в этой части, так как я пытался сопоставить определенный стиль и заказ на мой, и не все сработало, как я думал, и держу пари, что я потрачу больше времени на его работу, чтобы сделать его более последовательным. Тем не менее, я уверен, что у меня есть так много, что я уверен, что проблемы, которые у меня возникают, – это просто мое невежество и отсутствие знаний. Но я читал в местах, которые не все теги CSS работают при преобразовании в PDF, так что будьте осторожны. Weasyprint Документация Super Userful, и я бы порекомендовал использовать его для настройки некоторых стандартных тегов CSS для вашего PDF -вывода.

Мой index.html Шаблон следует за той же дизайном шаблона (extends _base.html , вызывает { % блок содержимого %} ) и создает представление:

Это простая таблица, которая показывает 4 столбца, занимает полную страницу и перечисляет список всех SDD в базе данных. Я просто использую для цикла, чтобы пройти через набор запросов и создавать линию для каждого элемента. Если вы думаете, что это превратится в большое количество, я бы посоветовал использовать некоторую логику в вашей модели, чтобы отфильтровать ее, чтобы сказать, последние 10 объектов (и добавить поиск) или, возможно, порядок по самым последним или чем -то в этом роде. Я мог бы представить, что это быстро выходит из -под контроля.

Для обоих Update.html и create.html , они довольно простые и копируют вставку между ними (с незначительными изменениями формулировки).

Обратите внимание, что я загружаю хрустящие формы , вы можете найти подробности об этом парне на pypi.org , и с ним очень легко работать. Я не сомневаюсь, что я едва поцарапаю службу этой библиотеки, но сейчас я просто использую поведение по умолчанию и работает нормально. В противном случае, как создание, так и обновление – это формы, которые записывают в базу данных, поэтому вы должны добавить в Django Security { % csrf_token %} В противном случае это не сработает правильно.

Тестирование

Как говорит Джейкоб Каплан-Мосс, один из оригинальных разработчиков Джанго, «Код без тестов нарушается по дизайну». (Кстати, я вытащил это прямо из главы тестирования учебника Django, полная кредит идет к этому документ ). Но большая часть моих знаний о тестировании (очень ограниченных) поступает от Джанго для профессионалов Уильяма Винсента, вы можете найти его Здесь Анкет Кстати, веб -сайт Уильяма Винсента отлично подходит для советов и приемов. Регулярный член Django -ориентированного подкаст который я слушаю регулярно. Не то чтобы я все понял (чего я не делаю) Но приятно слышать от профессионалов, чтобы узнать, сколько вы не знаете (LOL). В репозитории GitHub для этого проекта я позаботился о том, чтобы тестировать модель пользовательского пользователя (в ближайшее время) и приложение документа. test.py Файл для документа вытягивается почти почти словом от Django для профессионалов (я имею в виду, Уильям написал их, и они работают, зачем переосмыслить колесо правильно?). К счастью, тестовые примеры легко писать, читать и понимать, что хорошо.

Пользовательский пользователь модал

Из документации Django, книги Django для профессионалов, очевидно, что если вы собираетесь, или однажды, может потребоваться больше, чем по умолчанию имени пользователя/аутентификации пароля (то есть Google Auth, Github, Apple и т. Д.) Тогда вам нужно будет создать пользовательскую модель пользователя. И делать это на раннем этапе – лучшая практика. Я реализовал это здесь, в приложении, но не связал его с чем -то конкретным. Например, вы можете легко взять это дальше и связать его с Github (Tutorial здесь ) или Google (учебник здесь ). В любом случае, я настроил его для вас, возьмите это туда, куда нужно идти. Я думаю, что следующим логическим шагом будет использование электронной почты и пароля вместо имени пользователя и пароля, но это только мое мнение.

Что дальше?

Я не знаю, что еще делать здесь, в этом приложении, я уверен, что есть гораздо больше, что можно сделать, чтобы сделать его более общим или более универсальным для множества различных вариантов использования, но сейчас я иду Чтобы остановиться здесь, опубликуйте это на Dev.to и посмотрите, что произойдет. Вероятно, в этом приложении есть много кода, который не является чистым, элегантным или правильным, но он работает, проходит тесты и делает то, что должно. Это моя первая статья там (ну, в любом месте, если я буду честен), это может быть полная мусор, и в этом случае я прекрачу работу над этим. Однако, если вы хотите добавить к нему, вилка, что угодно, дайте мне знать.

Оригинал: “https://dev.to/ssbob/so-i-built-a-django-app-5f27”