Django:如何为内联模型表单集的字段设置初始值?

9 投票
3 回答
14280 浏览
提问于 2025-04-15 14:42

我遇到了一个我认为应该很简单的问题。我有一个内联模型表单集合,我想让一个选择框默认选中当前登录的用户。在视图中,我使用了Django的认证中间件,所以获取用户其实很简单,只需要访问 request.user 就可以了。

不过,我一直没弄明白的是,怎么才能把这个用户设置为包含用户列表的选择框(ModelChoiceField)中的默认选中值。有没有人能帮我解决这个问题?

3 个回答

0

我正在使用Rune Kaagaard上面提到的想法,不过我发现表单集(formsets)提供了一个额外的属性叫extra_forms:django.forms.formsets代码

@property
def extra_forms(self):
    """Return a list of all the extra forms in this formset."""
    return self.forms[self.initial_form_count():]

所以,继续用上面的例子:

formset = MyFormset(instance=myinstance)
user = request.user
for form in formset.extra_forms:
    form.initial['user'] = user.pk

这样就不需要测试任何初始表单了,只需为额外的表单提供默认值即可。

5

我不太确定如何在内联表单集中处理这个问题,但以下的方法适用于普通表单和模型表单:

你不能把这个设置在模型定义里,但可以在表单初始化的时候进行设置:

def __init__(self, logged_in_user, *args, **kwargs):
    super(self.__class__, self).__init__(*args, **kwargs)
    self.fields['my_user_field'].initial = logged_in_user

...

form = MyForm(request.user)
6

这个方法很有效。它的原理是设置所有“额外”表单的初始值。

formset = MyFormset(instance=myinstance)
user = request.user
for form in formset.forms:
    if 'user' not in form.initial:
        form.initial['user'] = user.pk

撰写回答