Есть несколько разных способов сделать это, но я думаю, что шаблонный фильтр может быть самым простым и гибким способом.
Получить значение:
Сначала, чтобы получить значение множителя из формы, вы просто выбираете его из запроса следующим образом:
multiplier = request.POST.get('multiplier', 1)
# 1 is set as default value if the value was not found.
Затем вы можете передать это значение в свой шаблон через контекстный словарь.
return render(request,
'inventory/index.html', {'form': form, 'list': list, 'multiplier': multiplier},)
Ваш код будет выглядеть следующим образом:
def index(request):
form = MultiplierForm()
list = Product.objects.all()
multiplier = 0
if request.method == "POST":
multiplier = request.POST.get('multiplier', 1)
form.multiplier = multiplier
return render(request, inventory/index.html', {'form': form, 'list': list, 'multiplier': multiplier},)
Создайте и используйте фильтр:
Теперь вам нужно создать собственный фильтр, который вы можете использовать вваши шаблоны.
Если у вас его еще нет, создайте папку с именем templatetags
на том же уровне каталогов, что и ваша папка templates
.(Внутри папки templatetags создайте файл с именем __init__.py
. Этот файл может быть пустым, но он должен быть там.) Внутри папки templatetags создайте файл с именем my_tags.py
(имя необязательно) и внутри этого файла вынапишите теги и фильтры вашего шаблона.
from django import template
register = template.Library()
@register.filter
def new_price(price, multiplier):
return price * multiplier
Затем в верхней части шаблона вы должны загрузить теги шаблона следующим образом:
{% load my_tags %}
Затем вы можете использовать фильтр следующим образомгде вы хотите поместить новую цену:
<p>New Price: {{product.price | new_price:multiplier}}</p>
Это передаст product.price
функции фильтра new_price
с multiplier
в качестве второго аргумента, и функция вернет price * multiplier
.
Дополнительно:
Теперь, если вы хотите показать новую цену, только если установлен множитель, вы можете изменить свой шаблон следующим образом:
{% if multiplier > 0 %}<p>New Price: {{product.price | new_price:multiplier}}</p>{% endif %}
РЕДАКТИРОВАТЬ:
Подробнее о тегах и фильтрах шаблонов можно прочитать здесь: https://docs.djangoproject.com/en/2.2/howto/custom-template-tags/