簡體   English   中英

Django form.save(commit=False) 不添加 user_id

[英]Django form.save(commit=False) not adding user_id

我正在嘗試添加由登錄用戶創建的內容,但即使我已登錄也沒有保存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"]

請幫忙

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.method == "POST"時才通過request.POST否則您應該簡單地寫TableAllotmentForm()

Abdul Aziz Barkat 建議的另一種方法是分配返回的 object 方法,例如 obj = form.save save() 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM