Django3.0 添加request.user 到表单请求

Django3.0 add request.user to form request

假设我们有这个模型:

class Creation(models.Model):
    title = models.CharField(max_length=DEFAULT_LENGTH)
    url = models.CharField(max_length=DEFAULT_LENGTH)    
    date = models.DateTimeField('date published', default=datetime.date.today)
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT)

    def __str__(self):
        return self.title

让我们使用这个视图:

def submit(request):
    FormSet = modelformset_factory(Creation, fields=('title', 'url'))
    if request.method == 'POST':
        formset = FormSet(request.POST, request.FILES)
        if formset.is_valid():
           obj = formset.save(commit=False)
            obj.author = request.user
            obj.save()
    else:
        formset = FormSet
    return render(request, 'app/submit.html', {'formset': formset})

保存formsetobj并添加request.user并将其提交到数据库。 这行不通,因为现在 django 抛出一个错误

'list' object has no attribute 'author'

这完全有道理,因为上面的字段列表中没有 author但是 如果我将 'author' 添加到 fields,通过 {{formset}} 呈现模板时将显示另一个选择框。 也许我可以编写自己的模板代码而不是使用 {{formset}} 并省略作者,但我觉得 Django3.0 必须有更优雅的方式。有没有?

我想要做的就是让外键author(见上面的模型)填充登录用户。

原来 modelformset_factory(..) 出了点问题。

如果您在 models.py 中使用正确的 CreationForm:

class CreationForm(ModelForm):
    class Meta:
        model = Creation
        fields = ['title', 'url']

并在您的 views.py:

中使用它
formset = CreationForm(request.POST)
    if request.method == 'POST':
        if formset.is_valid():
            f = formset.save(commit=False)
            f.author = request.user
            f.save()

有效。