One simple way is to do it after instantiating the formset.
def create_new_pea(request):
PeaFormset = inlineformset_factory(django.contrib.auth.models.User, Pea)
formset = PeaFormset(instance=request.user)
for form in formset:
form.fields['bowl'].queryset = request.user.bowl_set.all()
return render(request, 'app/pea/create.html', {'formset': formset}
I think it's possible to build this behavior into a custom Formset
class, overriding the _construct_forms
method:
class UserLimitedFormset(BaseInlineFormset):
def _construct_forms(self):
super(UserLimitedFormset, self)._construct_forms()
for form in self:
form.fields['bowl'].queryset = self.instance.bowl_set.all()
PeaFormset = inlineformset_factory(django.contrib.auth.models.User, Pea, formset=UserLimitedFormset)
To use the callback, I think you'd need a closure or a functools.partial
to record the user before creating the formset. Possibly this, although it's untested and I'm rusty on closures:
def create_new_pea(request):
user = request.user
def set_queryset(f, **kwargs):
formfield = f.formfield(**kwargs)
if f.name == 'bowl':
formfield.queryset = user.bowl_set.all()
return formfield
PeaFormset = inlineformset_factory(django.contrib.auth.models.User, Pea, formfield_callback=set_queryset)