如何在Django/Python中正确实现添加产品的视图
我在Django中有一个视图,用来把产品添加到购物车(我使用的是django-carton 1.2)。这是我的代码:
def add(request,product_id):
cart = Cart(request.session)
product = Product.objects.get(pk=product_id)
if product.quantity >=1:
cart.add(product, price=product.price)
product.quantity-=1
product.save()
return render (request,'shopping/show-cart.html')
else:
return HttpResponse("No product ")
当这个视图成功把某个产品添加到购物车后,购物车里会显示所有的产品。问题是:当我在浏览器中点击“重新加载当前页面”这个功能时,我购物车里的产品数量会增加。同时,我的删除产品的视图也在正常工作,但它只会在页面通过浏览器的功能重新加载时尝试删除产品。
2 个回答
0
你可以在你的HTML里加一个表单标签,这样就能发送信息,或者你也可以用Ajax请求来实现。
<script type="text/javascript">
$(document).ready(function(){
$('#add_cart_button').click(function(e)
{
$.ajax({
url: 'xxxxxxx',
type: 'POST',
dataType: 'html',
data: {
'somevariable' : 'somevalue'
},
async: false,
success: function(data){
$('#target').html(data);
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
alert("Status: " + textStatus); alert("Error: " + errorThrown);
}
});
当你发起Ajax请求时,它会把你在数据字典里放的内容发送到指定的URL。接下来,Django会根据你想要处理这些数据的功能来执行相应的操作,然后把结果返回给你。成功的函数基本上就是拿到这些信息后,按照你的需求去处理。在你的情况下,你可能只是想重新渲染一下显示购物车里商品的那部分HTML。成功函数里的目标标签就是用来渲染那部分HTML的,所以在你的HTML里要加一个目标div标签,指定你希望它显示的位置。
你可以通过在视图中使用 request.POST.get('key', somedefaultvalue) 来获取Ajax请求中的数据(这样如果找不到字典或者字典为空时,可以设置一个默认值),或者直接用 request.POST[key]。
0
你应该只在POST请求中进行修改数据的操作,比如添加和删除,而不是在GET请求中。你需要在页面上创建一个表单,即使这个表单里只有一个按钮。在进行任何操作之前,要先检查一下if request.method == 'POST'
。