如何在模板的视图和显示中动态计算值(Django)

时间:2019-06-19 20:52:30

标签: python html django

我想从两个用户输入字段(一个文本框和一个下拉列表)中动态提取值,然后将这些值发送到我的视图中以计算一个新值并在我的模板中显示该值。使用我当前的解决方案,当用户输入{{ 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 :(得分:0)

按提交键时没有任何反应,因为您没有将输入内容包装在

<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

根据您的评论,您还可以`return redirect(“ sales / presales”)以相同的形式显示该值。您必须将计算出的总数存储在会话变量中才能重新访问它。如果您将问题编辑为包括在内,我可以提供示例。

编辑:包括在第一个模板上显示总计。

为了利用会话,我们需要在项目文件夹的基本级别从命令行运行python manage.py migrate,以初始化数据库以存储会话信息并在视图之间传递信息。完成此操作后,您可以将redirect函数导入

  • 计算总数
  • 将其存储在会话变量“总计”中
  • 将用户发送回预售页面

我们可以使用{{request.session.total}}访问会话变量。

这不是最理想的解决方案,但它可以工作。