【问题标题】:Django form.save(commit=False) not adding user_idDjango form.save(commit=False) 不添加 user_id
【发布时间】:2021-04-14 16:38:54
【问题描述】:

我正在尝试添加由登录用户创建的内容,但即使我已登录也没有保存。form.created_by = request.user 没有添加登录用户。

def create_table_allotment(request):
    form = TableAllotmentForm(request.POST or None)
    context = {'form': form}

    if request.method == 'POST':
        if form.is_valid():
            try:
                form.save(commit=False)
                form.created_by = request.user
                form.save()
                return redirect('order_management:table_allotment_home')
            except IntegrityError as err:
                print('err => ', err)
                context['unique_error'] = 'User has already assigned table for today'

    return render(request, 'orders/table_allotment/create.html', context)

这是我的模型

class QOTs(models.Model):
    name = models.CharField(max_length=50)
    alias = models.CharField(max_length=10)

    def __str__(self):
        return str(self.name)

    class Meta:
        verbose_name_plural = "QOTs"


class TableAllotment(models.Model):
    employee = models.ForeignKey(User, on_delete=models.PROTECT)
    qot = models.ForeignKey(QOTs, on_delete=models.PROTECT)
    club = models.CharField(max_length=20, default='POS-0001')
    from_table = models.IntegerField()
    to_table = models.IntegerField()
    working_date = models.DateField(default=timezone.now)

    created_by = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='qot_creator')
    created_at = models.DateTimeField(_("Created at"), auto_now_add=True, editable=False)
    updated_at = models.DateTimeField(_("Updated at"), auto_now=True)

    class Meta:
        ordering = ('-id',)
        unique_together = ('employee', 'working_date',)

这是我的表格

class TableAllotmentForm(forms.ModelForm):
    class Meta:
        model = models.TableAllotment
        fields = ["employee", "qot", "from_table", "to_table"]

请帮忙

【问题讨论】:

    标签: python django django-models django-views django-forms


    【解决方案1】:

    form.save(commit=False) 将返回由表单包装的实例,然后您可以修改并调用save。相反,您只是在 form 上再次调用 save 并且您正在设置 form.created_by = request.user ,即您正在表单上设置一个属性。

    您应该直接修改由表单包裹的instance

    def create_table_allotment(request):
        form = TableAllotmentForm(request.POST or None)
        context = {'form': form}
    
        if request.method == 'POST':
            if form.is_valid():
                try:
                    form.instance.created_by = request.user
                    form.save()
                    return redirect('order_management:table_allotment_home')
                except IntegrityError as err:
                    print('err => ', err)
                    context['unique_error'] = 'User has already assigned table for today'
    
        return render(request, 'orders/table_allotment/create.html', context)
    

    注意TableAllotmentForm(request.POST or None) 是一种反模式(在某些情况下,空表单可能有效),您只需传递 request.POST,仅当 request.method == "POST" 否则你应该简单地写 TableAllotmentForm().

    【讨论】:

    • 谢谢 Abdul Aziz Barkat,您是救生员,非常感谢。
    • @MuhammadSharif 我还注意到您使用该 try-except 来防止那些完整性错误?也许这个question 可能对您有帮助,它是关于使表单本身验证唯一约束。
    【解决方案2】:

    Abdul Aziz Barkat 建议的另一种方法是分配 save()(Django-Docs) 方法的返回对象,例如 obj = form.save(commit=False)

    我还会在视图中添加@login_required

    from django.contrib.auth.decorators import login_required
    
    @login_required
    def create_table_allotment(request):
        if request.method == 'POST':
            form = TableAllotmentForm(request.POST)
            if form.is_valid():
                try:
                    obj = form.save(commit=False)
                    obj.created_by = request.user
                    obj.save()
                    return redirect('order_management:table_allotment_home')
                except IntegrityError as err:
                    print('err => ', err)
                    context['unique_error'] = 'User has already assigned table for today'
        else:
            form = TableAllotmentForm()
    
        context = {'form': form}
        return render(request, 'orders/table_allotment/create.html', context)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-02
      • 1970-01-01
      • 2010-11-14
      • 1970-01-01
      • 2012-10-02
      • 1970-01-01
      • 2015-03-11
      相关资源
      最近更新 更多