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

Django 4表单提交自动关联User外键ID至Reservation表问题求助

解决Django预订表单无法自动关联当前登录用户的问题

你的问题核心在于表单保存时没有将当前登录用户关联到Reservation实例。因为ReservationForm里未包含user字段,且保存表单时没有手动为该字段赋值,所以数据库中user字段始终为null。

1. 修改views.py的保存逻辑

表单验证通过后,不要直接调用form.save(),先获取未提交到数据库的实例,手动设置user字段为当前登录用户,再完成保存:

@login_required()
def user_new_reservation(request, pk=None):
    if request.method == 'POST':
        form = ReservationForm(request.POST)
        if form.is_valid():
            # 创建实例但暂不保存到数据库
            reservation = form.save(commit=False)
            # 关联当前登录用户
            reservation.user = request.user
            # 保存到数据库
            reservation.save()
            messages.success(request, 'Votre réservation a bien été envoyé!')
            return redirect('reservation:user_reservation', pk=request.user.id)
    else:
        form = ReservationForm()

    context = {'form': form}
    return render(request, 'reservation/new_reservation.html', context)

2. 额外优化建议

  • 修正模型缩进问题:原代码中__str__方法未缩进至Reservation类内部,会引发错误,调整后如下:
class Reservation(models.Model):
    fullName = models.CharField('Nom Complet', max_length=250, null=True)
    adress = models.CharField('Adresse', max_length=100, null=True)
    zip_code = models.IntegerField('Code Postal', null=True)
    city = models.CharField('Vile', max_length=100, null=True)
    email = models.EmailField('Email', max_length=250, null=True)
    phone = models.CharField('Telephone', max_length=20, null=False)
    date = models.CharField('Date', max_length=20, null=True, blank=True)
    hour = models.CharField('Heure', max_length=20, null=True, blank=True)
    message = models.TextField('Message', null=True)
    accepted = models.BooleanField('Valide', null=True)
    created_at = models.DateTimeField('Date Creation', auto_now_add=True, null=True)
    modified_at = models.DateTimeField('Date Mise Jour', auto_now=True, null=True)
    user = models.ForeignKey(User, null=True, on_delete=models.SET_NULL)

    def __str__(self):
        return self.fullName
  • 移除无用查询:原代码中user = User.objects.get(id=pk)未实际使用,且pk为空时会报错,直接删除即可,request.user已能获取当前登录用户。
  • 优化字段约束:若每个预订必须关联用户,可修改user字段去掉null=True,设置on_delete=models.CASCADE,更贴合业务逻辑:
user = models.ForeignKey(User, on_delete=models.CASCADE)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 04:15:25