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})
我保存formset
到obj
并添加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()
有效。
假设我们有这个模型:
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})
我保存formset
到obj
并添加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()
有效。