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
相关产品推荐
相关产品推荐

