django html: 依次点击一个按钮执行两个操作
django html: click one button for two actions in sequence
我有一个表格供用户填写一些数据。底部有两个按钮:“获取价格”和“立即订购”。
用户必须首先单击“获取价格”按钮以获取价格,然后单击“立即订购”按钮重定向到新页面。但是,我们无法控制用户行为,有些会直接点击“立即订购”按钮。那么对于“立即订购”按钮配置,有没有一种方法可以启用顺序点击(“获取价格”->“立即订购”),即当用户单击“立即订购”按钮时,程序将首先单击“获取价格”按钮,然后“立即订购”。
<form method="POST" hx-post="{% url 'OnlinePricing' %}" hx-target="#pickup_address"
hx-target="#delivery_address" hx-target="#distance" hx-target="#charge" @submit.prevent>
{% csrf_token %}
<div>
<label for="s1">pickup_address:</label>
<input type="text" name="pickup_address" value="" required="required" />
<br /><br />
</div>
<div>
<label for='s1'>delivery_address:</label>
<input type="text" name="delivery_address" value="" required="required" />
<br /><br />
</div>
...
<div>
<span id="pickup_address"> {{ pickup_address }} </span>
</div>
<div>
<span id="delivery_address"> {{ delivery_address }} </span>
</div>
<div>
<span id="distance"> {{ distance }} </span>
</div>
<div>
<span id="charge" > {{ charge }} </span>
</div>
<button type="submit">Get Price</button> <button type="submit" style="margin-left:10px;" onclick="location.href = '/order/'">Order Now</button>
</form>
最简单的方法是使用 JQuery。即:
<button id="get-price" type="submit">Get Price</button>
<button id="order-now" type="submit" style="margin-left:10px;">Order Now</button>
您的脚本将如下所示:
<script>
$( document ).ready(function() {
$("#order-now").on('click', function() {
$("#get-price").click() // trigger get-price click
window.location.href = '/order/'
})
})
</script>
但是,由于您的两个按钮都具有类型 submit
- 一旦它被点击 - 页面将被重新加载,因为提交 POST
请求相同的页面使其重新加载。
因此,您的逻辑似乎有问题,因为该页面需要提交两次。
我建议做的是用一些 API 替换获取价格的逻辑,它将通过 AJAX 调用而无需重新加载页面。
然后 - 一旦用户点击“获取价格” - 价格将动态加载,无需通过 AJAX 重新加载页面,因此您将在表单中只有一个提交按钮。
UPD 添加了片段来演示这个想法
$( document ).ready(function() {
$('#get-price').on('click', function() {
getPrice()
})
$('#order-now').on('click', function() {
getPrice().then(function() {
orderNow()
})
})
})
async function getPrice() {
return new Promise((resolve) => {
//here goes the logic of getting price. Timeout for delay simulation
setTimeout(() => {
$('#price').html('999.90')
resolve(true);
}, 2000);
})
}
async function orderNow() {
// your case:
// window.location.href = '/order/'
// alert for simulation
alert("ordered")
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<span id="price">0.00</span>
<button id="get-price">Get Price</button>
<button id="order-now">Order Now</button>
我有一个表格供用户填写一些数据。底部有两个按钮:“获取价格”和“立即订购”。
用户必须首先单击“获取价格”按钮以获取价格,然后单击“立即订购”按钮重定向到新页面。但是,我们无法控制用户行为,有些会直接点击“立即订购”按钮。那么对于“立即订购”按钮配置,有没有一种方法可以启用顺序点击(“获取价格”->“立即订购”),即当用户单击“立即订购”按钮时,程序将首先单击“获取价格”按钮,然后“立即订购”。
<form method="POST" hx-post="{% url 'OnlinePricing' %}" hx-target="#pickup_address"
hx-target="#delivery_address" hx-target="#distance" hx-target="#charge" @submit.prevent>
{% csrf_token %}
<div>
<label for="s1">pickup_address:</label>
<input type="text" name="pickup_address" value="" required="required" />
<br /><br />
</div>
<div>
<label for='s1'>delivery_address:</label>
<input type="text" name="delivery_address" value="" required="required" />
<br /><br />
</div>
...
<div>
<span id="pickup_address"> {{ pickup_address }} </span>
</div>
<div>
<span id="delivery_address"> {{ delivery_address }} </span>
</div>
<div>
<span id="distance"> {{ distance }} </span>
</div>
<div>
<span id="charge" > {{ charge }} </span>
</div>
<button type="submit">Get Price</button> <button type="submit" style="margin-left:10px;" onclick="location.href = '/order/'">Order Now</button>
</form>
最简单的方法是使用 JQuery。即:
<button id="get-price" type="submit">Get Price</button>
<button id="order-now" type="submit" style="margin-left:10px;">Order Now</button>
您的脚本将如下所示:
<script>
$( document ).ready(function() {
$("#order-now").on('click', function() {
$("#get-price").click() // trigger get-price click
window.location.href = '/order/'
})
})
</script>
但是,由于您的两个按钮都具有类型 submit
- 一旦它被点击 - 页面将被重新加载,因为提交 POST
请求相同的页面使其重新加载。
因此,您的逻辑似乎有问题,因为该页面需要提交两次。
我建议做的是用一些 API 替换获取价格的逻辑,它将通过 AJAX 调用而无需重新加载页面。
然后 - 一旦用户点击“获取价格” - 价格将动态加载,无需通过 AJAX 重新加载页面,因此您将在表单中只有一个提交按钮。
UPD 添加了片段来演示这个想法
$( document ).ready(function() {
$('#get-price').on('click', function() {
getPrice()
})
$('#order-now').on('click', function() {
getPrice().then(function() {
orderNow()
})
})
})
async function getPrice() {
return new Promise((resolve) => {
//here goes the logic of getting price. Timeout for delay simulation
setTimeout(() => {
$('#price').html('999.90')
resolve(true);
}, 2000);
})
}
async function orderNow() {
// your case:
// window.location.href = '/order/'
// alert for simulation
alert("ordered")
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<span id="price">0.00</span>
<button id="get-price">Get Price</button>
<button id="order-now">Order Now</button>