在视图中为空表单传递实例/默认值到ModelFormSet

2 投票
1 回答
1018 浏览
提问于 2025-04-16 02:36

我想知道怎么在一个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

撰写回答