You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django中通过按钮点击处理器实现数据保存

在Django中实现点击购买按钮保存车辆详情的方案

下面分步骤实现你需要的功能:

1. 创建购买记录的数据模型

首先新建一个数据表存储购买记录,在应用的models.py中添加如下模型:

from django.db import models
from django.contrib.auth.models import User
from .models import Car  # 假设你的车辆模型名为Car,根据实际情况调整

class Purchase(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='purchases')
    car = models.ForeignKey(Car, on_delete=models.CASCADE, related_name='purchased_records')
    purchased_at = models.DateTimeField(auto_now_add=True)
    # 可按需扩展字段:比如购买数量、实际支付金额等

    def __str__(self):
        return f"{self.user.username} 购买了 {self.car.car_name}"

添加完成后执行数据库迁移:

python manage.py makemigrations
python manage.py migrate

2. 修改模板中的购买按钮(表单提交方式)

把静态按钮包装进表单,确保能传递车辆ID并发送POST请求:

<div class="card-body">
    <img src="{{object.car_image.url}}" class="card-img-top" alt="...">
    <div class="card-body">
        <h5 class="card-title fw-bold text-uppercase gap-2">
        {{object.car_name}}
        </h5>
    <p class="card-text btn btn-sm btn-light disabled">Brand : {{object.car_brand}}</p>
    <div class="d-flex gap-2">
        <p class="card-text btn btn-sm btn-primary disabled">Quantity :{{object.quantity}}</p>
        <p class="card-text btn btn-sm btn-warning disabled ">Price :{{object.price}}</p>
    </div>
    <p class="card-text">{{object.description }}</p>
    {% if user.is_authenticated %}
        <form method="POST" action="{% url 'purchase_car' %}">
            {% csrf_token %}
            <input type="hidden" name="car_id" value="{{object.id}}">
            <button type="submit" class='btn btn-sm btn-success'>Buy Car</button>
        </form>
    {% else %}
        <p class="text-muted">请登录后购买</p>
    {% endif %}
</div>

3. 编写处理购买请求的视图

在应用的views.py中添加处理POST请求的视图函数:

from django.shortcuts import get_object_or_404, redirect
from django.contrib.auth.decorators import login_required
from .models import Car, Purchase

@login_required
def purchase_car(request):
    if request.method == 'POST':
        car_id = request.POST.get('car_id')
        car = get_object_or_404(Car, id=car_id)
        
        # 创建并保存购买记录
        Purchase.objects.create(
            user=request.user,
            car=car
        )

        # 可选:添加库存减少逻辑(如果需要)
        # if car.quantity > 0:
        #     car.quantity -= 1
        #     car.save()

        # 重定向到购买成功页或车辆详情页,按需求调整
        return redirect('car_detail', pk=car.id)  # 假设车辆详情页URL名称为car_detail
    # 若为GET请求,直接重定向回车辆详情页
    return redirect('car_detail', pk=request.GET.get('car_id'))

4. 配置URL路由

在应用的urls.py中添加对应的URL映射:

from django.urls import path
from . import views

urlpatterns = [
    # 其他已有URL...
    path('purchase-car/', views.purchase_car, name='purchase_car'),
]

可选:无刷新提交(AJAX方式)

如果想要页面不刷新完成购买,可采用AJAX实现,修改模板按钮并添加JS代码:

{% if user.is_authenticated %}
    <button class='btn btn-sm btn-success' id="buyCarBtn" data-car-id="{{object.id}}">Buy Car</button>
    <div id="purchaseMessage" class="mt-2"></div>
{% else %}
    <p class="text-muted">请登录后购买</p>
{% endif %}

<script>
document.getElementById('buyCarBtn').addEventListener('click', function() {
    const carId = this.dataset.carId;
    const csrfToken = document.querySelector('[name=csrfmiddlewaretoken]').value;
    
    fetch("{% url 'purchase_car' %}", {
        method: 'POST',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
            'X-CSRFToken': csrfToken
        },
        body: `car_id=${carId}`
    })
    .then(response => response.json())
    .then(data => {
        if (data.success) {
            document.getElementById('purchaseMessage').innerHTML = '<span class="text-success">购买成功!</span>';
            // 可在此更新页面元素,比如隐藏按钮、修改库存显示
        } else {
            document.getElementById('purchaseMessage').innerHTML = '<span class="text-danger">购买失败,请重试</span>';
        }
    })
    .catch(error => {
        console.error('Error:', error);
        document.getElementById('purchaseMessage').innerHTML = '<span class="text-danger">网络错误,请重试</span>';
    });
});
</script>

同时修改视图返回JSON响应:

from django.http import JsonResponse

@login_required
def purchase_car(request):
    if request.method == 'POST':
        car_id = request.POST.get('car_id')
        car = get_object_or_404(Car, id=car_id)
        
        Purchase.objects.create(user=request.user, car=car)
        
        # 可选:库存校验逻辑
        # if car.quantity > 0:
        #     car.quantity -=1
        #     car.save()
        #     return JsonResponse({'success': True})
        # else:
        #     return JsonResponse({'success': False, 'message': '库存不足'})
        
        return JsonResponse({'success': True})
    return JsonResponse({'success': False})

内容的提问来源于stack exchange,提问作者Md Ashraf Uddin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 22:25:13