在线等待:django提交表单并在同一页面显示结果

Online waiting: django submit form and display result in same page

我有一个紧急任务要制作一个网页,允许用户输入一些数据,后端进行一些计算,结果需要显示在输入字段正下方的同一页面中(例如机票在线价格检查)。

我是 django 和 html 的新手。下面是我的一个简单的在线计算器的第一个测试网页,试图弄清楚如何制作这样的网络服务。

我发现了一个问题,当点击“提交”按钮时,它往往会跳转到一个新的网页或一个新的网页选项卡。这不是我想要的。一旦用户输入数据并单击“提交”按钮,我希望页面上的“结果”字段直接显示结果(即仅部分更新此字段)而不 refresh/jump 到新页面。我还希望用户输入数据在单击“提交”后保留在同一页面中。

我看到可能有几种不同的方法来完成这项工作,iframe/AJAX。但是,几天来我一直在 searching/trying 寻找答案和解决方案,none 的答案对于这个非常基本的简单问题确实有效!!

html:

<form method="POST">
    {% csrf_token %}
    <div>
      <label>num_1:</label>
      <input type="text" name="num_1" value="1" placeholder="Enter value" />
    </div>
    <div>
      <label>num_2:</label>
      <input type="text" name="num_2" value="2" placeholder="Enter value" />
    </div>
    <br />
    <div>{{ result }}</div>
    <button type="submit">Submit</button>
</form>

view.py

def post_list(request):
    result = 0
    if request.method == "POST":
        num1 = request.POST.get('num_1')
        num2 = request.POST.get('num_2')
        result = int(num1) + int(num2)
        print(request.POST)
        print(result)

    context = {
        'result': result
    }
    return render(request, 'blog/post_list.html', context)

我建议看一下 htmx.org,它使这变得非常简单,而无需编写任何实际的 JS。

以你的例子为例:

(1) 将 htmx JS(只有 10k 左右)添加到 HTML,并使用 hx-posthx-target 触发表单上的 ajax 调用。使用这些表单将触发 AJAX 请求,并且 hx-target 告诉 htmx 获取响应(您希望它只是计算的结果)并将其放入 div无需刷新整个页面。 有关详细信息,请参阅 docs。 另请注意,我为包含结果的 div 提供了 id。 您需要将 hx-post="{% url 'blog:post_list' %}" 替换为您视图的正确名称(我们不知道,因为您没有 post 您的 urls.py)。

<html>
    <body>
        <form method="POST" hx-post="{% url 'blog:post_list' %}" hx-target="#result">
            {% csrf_token %}
            <div>
            <label>num_1:</label>
            <input type="text" name="num_1" value="1" placeholder="Enter value" />
            </div>
            <div>
            <label>num_2:</label>
            <input type="text" name="num_2" value="2" placeholder="Enter value" />
            </div>
            <br />
            <div id="result">{{ result }}</div>
            <button type="submit">Submit</button>
        </form>
        <script src="https://unpkg.com/htmx.org@1.6.1"></script>
    </body>
</html>

(2) 在您看来,您可以通过检查 headers 来确定请求是否是来自 htmx 的 AJAX 请求,在这种情况下,您只想 return 结果。有更简单或优雅的方法可以做到这一点(例如检查 django-htmx,但只是为了简单起见:

from django.http.response import HttpResponse
from django.shortcuts import render

# Create your views here.
def post_list(request):
    result = 0
    if request.method == "POST":
        num1 = request.POST.get('num_1')
        num2 = request.POST.get('num_2')
        result = int(num1) + int(num2)

    if request.headers.get('Hx-Request') == 'true':
        # return only the result to be replaced
        return HttpResponse(str(result))
    else:
        return render(request, 'blog/post_list.html', {'result': result})