Как динамически вычислять значение в представлении и отображать в шаблоне (Django) - PullRequest
1 голос
/ 19 июня 2019

Я хочу динамически извлекать значения из двух полей ввода пользователя, текстового поля и раскрывающегося списка, а затем отправлять эти значения в мое представление, чтобы вычислить новое значение и отобразить указанное значение в моем шаблоне. В моем текущем решении {{ total }} никогда не выдает значение, когда пользователь вводит hours и выбирается engineer_level. Это кажется довольно простым сценарием, но я новичок в Django / Python. Любая помощь с благодарностью!

Кроме того, как я могу сохранить значение в качестве переменной сеанса?

views.py

def presales(request):
    my_opportunities = cwObj.get_opportunities()
    context = {'my_opportunities': my_opportunities}
    return render(request, 'website/presales.html', context)

def presales_total(request):
    hours = request.GET.get('hours')
    engineer_level = request.GET.get('selected_engineer_level')
    if engineer_level == 'PM':
        wage = 225
    elif engineer_level == 'Solutions Technician':
        wage = 175
    elif engineer_level == 'Solutions Engineer':
        wage = 225
    elif engineer_level == 'Senior Solutions Engineer':
        wage = 275
    elif engineer_level == 'Solutions Architect':
        wage = 275
    total = wage * hours

    context = {'total': total}
    return render(request, 'website/presales_total.html', context)

presales.html

<div class="field">
                        <div class="control">
                            <input class="input" name="hours" id="hours" placeholder="Hours">
                        </div>
                    </div>
                    <label class="label">Engineer Level:</label>
                    <div class="field">
                        <div class="select">
                            <select name="selected_engineer_level" id="selected_engineer_level">
                                <option value="">Engineer Level</option>
                                <option value="PM">PM</option>
                                <option value="Solutions Technician">Solutions Technician</option>
                                <option value="Solutions Engineer">Solutions Engineer</option>
                                <option value="Senior Solutions Engineer">Senior Solutions Engineer</option>
                                <option value="Solutions Architect">Solutions Architect</option>
                            </select>
                        </div>
                    </div>
                </div>
                <div class="field">
                    <div class="control">
                        <button class="button is-info" type="button">Add Task</button>
                    </div>
                </div>
                <span class="label is-medium is-pulled-right">Total: {{ total }}</span>

presales_total.html

Total:
<span>{{ total }}</span>

1 Ответ

0 голосов
/ 20 июня 2019

Ничего не происходит, когда вы нажимаете "Отправить", потому что вы не обернули свои входные данные в тег

<form action=".../presales_total" method="post">
...
</form>

.

Вам необходимо будет включить токен csrf {% csrf_token %}, преобразоватьтип кнопки «отправить», а также измените метод на POST.

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

views.py

from django.shortcuts import render, redirect  ## Added 'redirect'

def presales(request):
    # my_opportunities = cwObj.get_opportunities()
    # context = {'my_opportunities': my_opportunities}
    return render(request, 'sales/presales.html')

def presales_total(request):
    if request.method=='POST':  # add this line

        hours = request.POST['hours']   # change to POST
        engineer_level = request.POST['selected_engineer_level']   # change to post
        if engineer_level == 'PM':
            wage = 225
        elif engineer_level == 'Solutions Technician':
            wage = 175
        elif engineer_level == 'Solutions Engineer':
            wage = 225
        elif engineer_level == 'Senior Solutions Engineer':
            wage = 275
        elif engineer_level == 'Solutions Architect':
            wage = 275
        total = wage * int(hours)   # POST request default submissions to string, convert to type int with int()

        request.session['total'] = total ## store the value in session
        return redirect('/sales/presales') ## send the user back to the first page

presales.html

<form action="/sales/presales_total" method="post">   # add this line
    {% csrf_token %}   # add this line
<div class="field">
    <div class="control">
        <input class="input" name="hours" id="hours" placeholder="Hours">
    </div>
</div>
<label class="label">Engineer Level:</label>
<div class="field">
    <div class="select">
        <select name="selected_engineer_level" id="selected_engineer_level">
            <option value="">Engineer Level</option>
            <option value="PM">PM</option>
            <option value="Solutions Technician">Solutions Technician</option>
            <option value="Solutions Engineer">Solutions Engineer</option>
            <option value="Senior Solutions Engineer">Senior Solutions Engineer</option>
            <option value="Solutions Architect">Solutions Architect</option>
        </select>
    </div>
</div>
</div>
<div class="field">
<div class="control">
    <button class="button is-info" type="submit">Add Task</button>   # change to 'submit'
</div>
</div>
<span class="label is-medium is-pulled-right">Total: {{ request.session.total }}</span>
</form>   # add this line ## change the template variable to 'request.session.total

На основе вашего комментария вы также можете `вернуть перенаправление (" продажи / предварительные продажи "), чтобы отобразить значение на том же самомформа.Вы должны будете сохранить вычисленную сумму в переменной сеанса, чтобы иметь возможность повторно получить к ней доступ.Если вы измените вопрос, включив его, я могу привести пример.

Редактировать: включить отображение итогов в первом шаблоне.

Чтобы использовать сеансы, нам нужно запустить python manage.py migrate из командной строки на базовом уровне папки вашего проекта, чтобы инициализировать базу данных для хранения информации о сеансе и передачи информации между представлениями.Как только вы это сделаете, вы можете импортировать функцию redirect в

  • , вычислить сумму
  • и сохранить ее в переменной сеанса 'total'
  • sendпользователь возвращается на страницу предварительной продажи

Там мы можем получить доступ к переменной сеанса с помощью {{request.session.total}}.

Это не самое причудливое решение, но оно работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...