在视图中为空表单传递实例/默认值到ModelFormSet
我想知道怎么在一个ModelFormSet中预先填充exclude字段。下面的AuthorFormSet不接受instance参数,只能接受查询集(queryset)。那么我怎么能让新创建的表单不带有NULL或None的user属性呢?我想把这个用户字段设置为request.user。
models.py
class Author(models.Model):
user = models.ForeignKey(User, related_name='author')
# assume some other fields here, but not relevant to the discussion.
forms.py
class AuthorForm(forms.ModelForm):
class Meta:
model = Author
class BaseAuthorFormSet(BaseModelFormSet):
"""will do some clean() here"""
pass
AuthorFormSet = modelformset_factory(Author,\
form=AuthorForm, \
formset=BaseAuthorFormSet, extra=1,\
exclude=('user',)
)
views.py
def my_view(request):
if request.method == 'POST':
formset = AuthorFormSet(request.POST)
if form.is_valid():
form.save() # This will cause problems
# for the empty form i added,
# since user can't be null.
EDIT
这是我在视图中最终做的事情。Wogan的回答部分正确,我觉得只是缺少了遍历所有表单的那部分。
for form in formset.forms:
form.instance.user = request.user
formset.save()
1 个回答
1
你可以在模型表单中排除一些字段,这样在用modelformset_factory
创建的表单集合中就不会包含这些字段了。
class AuthorForm(forms.ModelForm):
class Meta:
model = Author
exclude = ('user',)
在你的视图中,给表单的save()
方法传递commit=False
,然后手动设置用户字段:
def my_view(request):
if request.method == 'POST':
formset = AuthorFormSet(request.POST)
if formset.is_valid():
for author in formset.save(commit=False):
author.user = request.user
author.save()
formset.save_m2m() # if your model has many to many relationships you need to call this