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

如何在Django中通过按钮向数据库插入数据并获取新记录ID

解决Django点击按钮插入数据并获取新增记录ID的问题

现有实现代码

前端按钮代码

<a href="{% url "main:create_bd_line" %}"><button type="button" class="btn btn-secondary">Начать</button></a>

视图函数片段

def create_bd_line(request):
    user_group = request.user.groups.values_list()
    university = user_group[0][1]
    num = Answers.objects.all().count() # 表中记录数量

Answers模型定义(models.py)

class Answers(models.Model):
    id = models.BigIntegerField(primary_key=True)
    id_univ = models.TextField(max_length=120, blank=True, null=True)
    q1 = models.CharField(max_length=100, blank=True, null=True)
    q2 = models.CharField(max_length=100, blank=True, null=True)
    q3 = models.CharField(max_length=100, blank=True, null=True)
    q4 = models.CharField(max_length=100, blank=True, null=True)
    q5 = models.CharField(max_length=100, blank=True, null=True)
    q6 = models.CharField(max_length=100, blank=True, null=True)

完善插入逻辑并获取新增ID

1. 主键处理(可选优化)

你当前手动指定了id为BigIntegerField主键,Django默认会自动生成自增的AutoField主键,无需手动定义。如果没有特殊的ID规则需求,建议删除手动定义的id字段,让框架自动处理,这样插入时无需手动生成ID,更简洁可靠:

class Answers(models.Model):
    # 移除手动id字段,Django自动生成自增主键
    id_univ = models.TextField(max_length=120, blank=True, null=True)
    q1 = models.CharField(max_length=100, blank=True, null=True)
    q2 = models.CharField(max_length=100, blank=True, null=True)
    q3 = models.CharField(max_length=100, blank=True, null=True)
    q4 = models.CharField(max_length=100, blank=True, null=True)
    q5 = models.CharField(max_length=100, blank=True, null=True)
    q6 = models.CharField(max_length=100, blank=True, null=True)

如果必须保留自定义BigIntegerField主键,需要手动生成唯一ID,注意处理并发场景下的重复问题。

2. 完善视图函数

场景一:使用Django自动主键

直接通过create()方法创建实例,保存后即可获取ID:

from django.shortcuts import redirect

def create_bd_line(request):
    # 获取用户所属大学(假设用户仅属于一个组,多组场景需额外处理)
    user_group = request.user.groups.first()
    if not user_group:
        # 无组时跳转错误页或返回提示
        return redirect('main:error_page')
    university = user_group.name

    # 创建新记录
    new_answer = Answers.objects.create(
        id_univ=university,
        # q1-q6暂时为空,后续可通过ID更新
        q1='', q2='', q3='', q4='', q5='', q6=''
    )
    # 直接获取新增记录ID
    new_record_id = new_answer.id

    # 示例:跳转至问卷填写页并携带ID
    return redirect('main:fill_questionnaire', record_id=new_record_id)

场景二:保留自定义主键

手动生成唯一ID(示例用现有最大ID+1,高并发下需加事务或用更可靠的生成方式):

from django.shortcuts import redirect
from django.db.models import Max

def create_bd_line(request):
    user_group = request.user.groups.first()
    if not user_group:
        return redirect('main:error_page')
    university = user_group.name

    # 生成自定义ID
    max_existing_id = Answers.objects.aggregate(Max('id'))['id__max'] or 0
    new_id = max_existing_id + 1

    # 创建并保存记录
    new_answer = Answers.objects.create(
        id=new_id,
        id_univ=university,
        q1='', q2='', q3='', q4='', q5='', q6=''
    )
    new_record_id = new_answer.id  # 或直接用new_id

    return redirect('main:fill_questionnaire', record_id=new_record_id)

3. 前端请求优化(可选)

当前用<a>标签发起GET请求,数据插入属于写操作,推荐用POST请求避免重复提交:

<form action="{% url 'main:create_bd_line' %}" method="post">
    {% csrf_token %}
    <button type="submit" class="btn btn-secondary">Начать</button>
</form>

同时视图需处理POST请求:

def create_bd_line(request):
    if request.method != 'POST':
        return redirect('main:home')
    
    # 插入逻辑写在这里
    ...

内容的提问来源于stack exchange,提问作者LeonidPetrovich

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 04:40:40