Как выполнить расчет по атрибуту модели с вводом для формы в Django - PullRequest
1 голос
/ 05 апреля 2019

Я новичок в Python / Django здесь, но усердно работаю

Чтобы тренироваться, я работаю над простым представлением, которое
будет вводить данные через форму (DecimalField)
-Передать его в представление, где он выполняет вычисления на основе моего метода класса
-Отобразить его в моем шаблоне, ниже непосредственно в InputForm и рядом с другими моими атрибутами класса / объекта

++ CODEUPDATE ++ значение из формы перехватывается и передается обратно в шаблон через {data}, но я не могу передать его методу Model ... Где я должен поместить экземпляр функции в представления?или, может быть, у меня проблема с идентификацией ...

, в конце концов мой шаблон будет выглядеть так:

<br>
{% for list in list %}<br>
<div> {{ list.price }} <div> <div> {{ list.newprice}} <br><br>

с CSS, который я уже использую, конечно,

Модели:

class Product(models.Model):
    name = models.CharField(max_length=20)
    cost = models.DecimalField(decimal_places=2, max_digits=5)
    price = models.DecimalField(decimal_places=2, max_digits=5)

    def __str__(self):
        return self.name

    def newprice(self, input):
        newprice = self.price * input
        return newprice

Форма:

class MultiplierForm(forms.Form):
    multiplier = forms.IntegerField(label='Your cost')

Вид:

def multi(request):
    list = Product.objects.all()
    data = 0
    if request.method == "POST":
        form = MultiplierForm(request.POST or None)
        if form.is_valid():
            data = request.POST.get('value_from_form')

    else : form = MultiForm(request.POST or None)

    p = Product.newprice() ##this code crash the server. 
                           ##If you I it above the else :form the template display
                           ## but crashes when I submit a value with a   
                           ## Function is Missing Argument error
    p(data)

    return render(request, 'viewinventory/multi.html', {'form': form, 'list': list, 'data': data})

++ ОБНОВЛЕНИЕ КОДА ++ значение из формы перехватывается и передается обратношаблон через {data}, но я не могу передать его методом Model ... Где я должен поместить экземпляр функции в представления?или, может быть, у меня проблема с идентификацией ... Я хочу остаться простым и не ходить на неизведанные территории, такие как фильтр и все

Ответы [ 2 ]

0 голосов
/ 07 апреля 2019

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

Получить значение:

Сначала, чтобы получить значение множителя из формы, вы просто выбираете его из запроса следующим образом:

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/

0 голосов
/ 05 апреля 2019

В Django говорится, что "Толстые модели, тонкие представления, глупые шаблоны и служебные модули."

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

Но очевидно, что вы можете сделать это, либо написав свой код внутри views.py или напишите его внутри Model class / служебный метод .

Я бы предложил написать свой расчет по другой функции полезности или по Django модели.Это было бы довольно просто, как «Тонкие взгляды и толстая модель» Концепция.

...