"user" 在将 data-dict 解析为 Django 表单时未设置,但所有其他字段都是

"user" is not set when parsing a data-dict to a Django form, but all other fields are

假设我有以下内容

#models.py

class MyModel(models.Model):

    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete = models.CASCADE,null=True)
    link = models.URLField(max_length=2048)
    date_added = models.DateTimeField(default = timezone.now)
    used = models.BooleanField(default = True)

和我的表格

class MyModelForm(forms.ModelForm):
    class Meta:
        model = Wishlist
        exclude = [
            "user","date_added"
        ]

如果我尝试创建一个实例(请注意,为清楚起见,我省略了 if request.method="POST" 等)

def myView(request):
    user = request.user

    instance = MyModel(user=user)
    data = {"link":link,"date_added":domain,"user":user}
    form = MyModelForm(data=data)
    form.save()

linkdate_added 已写入数据库,但 user 字段为空。

如果我在创建表单后将 user 设置为实例,如

def myView(request):
    user = request.user

    instance = MyModel(user=user)
    data = {"link":link,"date_added":domain}
    form = MyModelForm(data=data)
    form.save(commit=False)
    form.instance.user = user  #Setting the user here
    form.save()

它就像一个魅力。

为什么我无法在data-dict中设置user,有什么办法吗?

How come, I cannot set the user in the data-dict.

表单将忽略所有不需要处理的字段。这使得网络服务器更安全:这里我们确保用户不能为另一个用户创建MyModel

如果某个字段因此属于 excluded 属性,或者不属于 Meta class 的 fields 属性,则表单将 设置对应的模型对象属性

您没有在表格中指定 instance:

def myView(request):
    user = request.user
    instance = MyModel(user=user)
    data = {"link":link,"date_added":domain}
    form = MyModelForm(data=data<b>, instance=instance</b>)
    form.save()