Django:如何为内联模型表单集的字段设置初始值?
我遇到了一个我认为应该很简单的问题。我有一个内联模型表单集合,我想让一个选择框默认选中当前登录的用户。在视图中,我使用了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