在 Django 中,当登录用户提交表单时,如何自动将用户名添加到模型

In Django, how to add username to a Model automatically, when the Form is submitted by a logged in user

在我的 Django 应用程序中,我使用 ForeignKey 定义了多对一关系。 现在我想要的是,当登录用户提交 ListForm 时,他的 username 应该自动添加到 ListModelowner 字段中。 目前,当用户提交表单时,None 显示在所有者字段中,如何将用户名与表单一起添加到数据库?

我的models.py:

from django.db import models
from django.contrib.auth.models import User

class ListModel(models.Model):
    owner = models.ForeignKey(User, blank=True, null=True, on_delete=models.CASCADE)
    task = models.CharField(max_length=255)
    completed = models.BooleanField(default=False)

我的forms.py:

from django.forms import ModelForm
from .models import ListModel
from django import forms


class ListForm(ModelForm):
    class Meta:
        model = ListModel
        fields = ['owner','task', 'completed']

您必须覆盖视图的 form_valid() 方法并将当前登录的用户附加为所有者。

    def form_valid(self, form):
        form.instance.owner = self.request.user   <------ This line will do the trick.
        return super().form_valid(form)

终于成功了 (my solution reference)

首先,我们需要从forms.py中的ModelForm中排除owner字段:

class ListForm(ModelForm):
    class Meta:
        model = ListModel
        fields = ['task', 'completed']
        # instead of above line we can simply write: exclude = ['owner']

并且在 views.py:

form = ListForm(request.POST)
if form.is_valid():
    task_list = form.save(commit=False)
    task_list.owner = request.user
    task_list.save()
    return redirect('/')

我们可以使用任何变量而不是 task_list 并且还要注意在 task_list.save() 之后不需要做 form.save() 因为它已经包含在 task_list = form.save(commit=False)