普通的form field初始化过程:
class UserNotificationForm(forms.Form):
by_stream_bundle = forms.ModelMultipleChoiceField(queryset=BundleStream.objects.all())
但此时queryset将不能接受参数,而且就算使用了__init__(),因为member和__init__调用先后的关系,也不能改变by_stream_bundle field的参数。
Solution: ()
class UserNotificationForm(forms.Form):
def __init__(self, user, *args, **kwargs):
super(UserNotificationForm, self).__init__(*args, **kwargs)
self.user = user
self.fields['by_stream_bundle'] = forms.ModelMultipleChoiceField(queryset=BundleStream.objects.accessible_by_principal(self.user))
OR
class UserNotificationForm(forms.Form):
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user')
super(UserNotificationForm, self).__init__(*args, **kwargs)
self.fields['by_stream_bundle'] =
forms.ModelMultipleChoiceField(queryset=BundleStream.objects.accessible_by_principal(self.user))