django калькулятор в форме

how to create a tariff calculator in django?

basically i’m creating a tariff calculator for a utility company in my country, based on a progressive rates table, an example given below

(b) Proportionate fee for every gallon thereafter up to 2,000 gallons inclusive at the rate per 1,000 gallons of ………………..$15.89

I’m thinking of doing a Rate model with the following fields:

my view would accept post from a form with the amount of gallons, area of supply and should post back the usage calculated from the rate table.

i would do something like this in the view

this is the most simple e.g i can think of, however i’m not sure how i would handle the progressive rates. any ideas? am i on the right track?

2 Answers 2

Business rules should be expressed in code. More info

After reading your question a little closer, It looks possible that you might have many such tables you’ve got to query. Putting many similar such structures legitimately goes into a database. For now I’ll assume you have that. If you really only have one table, a case analysis is probably most concise.

In my own django apps I’ve found that a very natural place to put business logic is in forms. Models seem obvious, but seldom have access to the context necessary to make informed decisions about what can go where.

Usually I’ll divide this into several, dependent apps. One app provides very high level, abstract models and forms. Another app extends the forms from the first with business rules.

The first problem is querying the Rate model. The bit of code for that doesn’t actually work. You can’t pass lazy comparisons in python. Django has a mechanism for that, by mangling the argument names.

I’m not sure what your db looks like, but make sure there’s an index on from_gallons and to_gallons, or this query will be very slow.

Your example doesn’t sound like it actually alters state. If this is true, then you should probably be using a GET view rather than POST.

In either case the first part of the logic is the same. Recieve a request and validate the form input.

Now all thats needed is to actually use it.

Very little business knowledge is embedded in the view. Only the fact that the form stores a cleaned calculation result in its «usage» key. But since the view is precisely for obtaining that value, this is doing the right thing.

A template to use the form is also required. (My django template skill is only so-so. As i said, I prefer jinja2 and so should you)

Personally, I don’t much like to muck about with moving individual form results into a template context, I just use the whole, processed form. I write my own templates in jinja2, though, so if your template designers are not trustworthy, you might want to craft your contexts a bit more carefully than this.

Again, no more business logic appears in the template than does in the view.

Источник

Метод модели Джанго или расчет как поле в базе данных

Мне нужно хранить «вычисленные» переменные в виде полей в базе данных модели Django.

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

Я хочу сделать то же самое с Age. Вот что я имею в расчете:

Поэтому я хотел бы хранить переменные UniqueID и Age в базе данных как поля в модели Person. Какова лучшая практика при этом? Нужно ли сначала инициализировать поля, а затем выполнить какой-либо запрос на обновление к ним?

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

Заранее спасибо! Пожалуйста, помогите мне улучшить то, что у меня уже есть.

2 ответа

Вы должны переопределить метод save вашей Модели Person и создать поле unique_id и age в Модели.

Модель имеет <> метод для такого рода вещей:

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

Так что потеряйте свойство и добавьте поле с именем «unique_id», которое должно быть CharField. Переименуйте get_id в clean и замените оператор return на:

Источник

Формы в Django

Формы Django удобны тем, что мы можем создать новую форму с нуля или воспользоваться ModelForm для сохранения содержимого формы в модель.

Теперь открой его и набери следующее:

В завершение мы можем указать, какие поля должны присутствовать в нашей форме. Сейчас нам требуются только поля title и text — author будет автоматически выбран в зависимости от авторизованного пользователя (тебя), а created_date должна автоматически проставляться в момент создания записи (т.е. через код), верно?

Вот и всё! Теперь мы можем использовать форму в представлении и отобразить её в шаблоне.

Поэтому снова нам необходимо создать ссылку на страницу, URL-адрес, представление и шаблон.

Ссылка на страницу с формой

После добавления строки твой html-файл должен выглядеть следующим образом:

Нам нужно открыть файл blog/urls.py и добавить строку:

Окончательная версия файла будет выглядеть следующим образом:

Представление post_new

Самое время открыть файл blog/views.py и добавить следующую строку к остальным, начинающимся с from :

А затем наше представление:

Шаблон

csrf2

Хорошо, давай посмотрим, как должен выглядеть HTML-код в файле post_edit.html :

Время обновить страницу! Ура! Форма отображается!

new form2

Но подожди минутку! Если ты наберёшь что-нибудь в полях title и text и попробуешь сохранить — что произойдёт?

Ничего! Мы снова на той же странице и наш текст пропал. и новая запись не была добавлена. Так что же пошло не так?

Ответ прост: ничего. Нам нужно сделать кое-что ещё, чтобы новое представление заработало.

Сохраняем данные из формы

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

Мы проверяем, допустимо ли содержимое формы, и, если всё в порядке, сохраняем её!

Наконец, будет прекрасно, если мы сможем сразу переходить к странице post_detail после добавления новой записи, согласна? Для этого нам понадобится еще один импорт:

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

Хорошо, мы многое обсудили, пора взглянуть на представление полностью, верно?

Возможно, ты заметила, что мы устанавливаем дату публикации перед сохранением поста. В последствии мы сделаем кнопку публикации в Django Girls Tutorial: Extensions.

Поскольку мы недавно использовали панель администратора Django, система до сих пор думает, что мы авторизованы. Существует несколько случаев, когда мы можем случайно выйти из аккаунта (закрытие браузера, перезапуск базы данных и т.д.). Если ты получаешь ошибку при попытке сохранения записи, то потребуется перейти на страницу http://127.0.0.1:8000/admin и авторизоваться в системе снова. Это решит проблему. В главе Домашнее задание: добавляем безопасность нашему веб-сайту! после основного учебника описано окончательное решение этой проблемы.

post create error

Валидация формы

form validation2

Django заботится о проверке всех полей в нашей форме на корректность. Разве не шикарно?

Форма редактирования

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

Открой blog/templates/blog/post_detail.html и добавь следующую строку:

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

В файле blog/urls.py добавь:

Давай откроем файл blog/views.py и добавим в самый конец следующее:

… и когда мы открываем форму для редактирования:

Когда ты её нажмёшь, то увидишь форму с выбранной записью:

edit form2

Поменяй заголовок и текст, а затем сохрани запись!

Поздравляем! Твое приложение становится всё более сложным!

Если тебе нужно больше информации о формах в Django, обратись к официальной документации: https://docs.djangoproject.com/en/2.0/topics/forms/

Безопасность

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

Из-за этого <% if %>ссылка будет отправлена в браузер, только если запрашивающий страницу пользователь вошёл в систему. Это не обезопасит создание новых постов полностью, но для начала и это неплохо. Мы подробнее рассмотрим вопросы безопасности в дополнении к учебнику.

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

Открой файл blog/templates/blog/post_detail.html и найди такую строку:

Замени её на следующее:

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

И последнее: публикация!

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

(Не забудь подставить вместо свой поддомен на PythonAnywhere без угловых скобок.)

Источник

Работа с формами¶

Если вы не планируете создавать веб-сайты и приложения, которые будут только публиковать содержимое и не будут принимать данные от посетителей, вам необходимо понимать и использовать формы.

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

HTML-формы¶

В качестве примера, форма входа для администратора Django содержит несколько элементов : один из type=»text» для имени пользователя, один из type=»password» для пароля и один из type=»submit» для кнопки «Войти». Он также содержит некоторые скрытые текстовые поля, которые пользователь не видит, и которые Django использует для определения того, что делать дальше.

Он также сообщает браузеру, что данные формы должны быть отправлены на URL, указанный в атрибуте

Вам понадобится представление, которое отображает шаблон, содержащий HTML-форму, и которое может предоставлять поле current_name по мере необходимости.

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

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

На данном этапе гораздо проще заставить Django сделать большую часть этой работы за нас.

Источник

Разработка своей системы биллинга на Django

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

Задачи

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

Транзакции

Основной единицей системы, очевидно, была выбрана транзакция. Для транзакции была написана следующая простая модель:
Транзакция состоит из ссылки на пользователя, причины пополнения (или списания), суммы транзакции и времени совершения операции.

Баланс

Баланс пользователя очень легко посчитать при помощи функции annotate из ORM Django (считаем сумму значений одного столбца), но мы столкнулись с тем, что при большом количестве транзакций данная операция сильно нагружает БД. Поэтому было решено денормализовать БД, добавив поле “balance” в модель пользователя. Данное поле обновляется в методе “save” в модели “UserBalanceChange”, а для уверенности в актуальности данных в нем, мы каждую ночь его пересчитываем.
Правильнее, конечно же, хранить информацию о текущем балансе пользователя в кэше (например, в Redis) и инвалидировать при каждом изменении модели.

Прием платежей

Списание средств

Со списаниями чуть сложнее – перед операцией необходимо проверять, каким будет баланс счета после проведения операции, причем “по-честному” – при помощи annotate. Это необходимо делать для того, чтобы не обслуживать пользователя “в кредит”, что особенно важно, когда транзакции выполняются на большие суммы.
Здесь мы написали без annotate, так как в данейшем есть дополнительные проверки.

Повторяющиеся списания

Данная система, к сожалению, не является гибкой: если мы добавим еще один тип повторяющихся платежей — придется добавлять новое поле. Скорее всего, в процессе рефакторинга, мы напишем дополнительную модель. Примерно такую:

Эта модель позволит очень гибко реализовать повторяющиеся платежи.

Dashboard

Источник

Понравилась статья? Поделить с друзьями:
Добавить комментарий
  • Как сделать успешный бизнес на ритуальных услугах
  • Выездной кейтеринг в России
  • Риски бизнеса: без чего не обойтись на пути к успеху
  • django как создать приложение
  • django как переименовать приложение