Django: Filter ModelChoiceField by user
django, python
Solution
You can pass `request.user` to form init in view:
def some_view(request):
form = TransactionForm(user=request.user)
and add `user` parameter to form `__init__` method (or pop it from `kwargs` in form):
class TransactionForm(ModelForm):
class Meta:
model = Transaction
# def __init__(self, *args, **kwargs):
# user = kwargs.pop('user', User.objects.get(pk_of_default_user))
def __init__(self, user, *args, **kwargs):
super(TransactionForm, self).__init__(*args, **kwargs)
self.fields['category'] = forms.ModelChoiceField(
queryset=Category.objects.filter(user=user))
update: in class based views you can add extra parameter to form init in `get_form_kwargs`:
class TransUpdateView(UpdateView):
#...
def get_form_kwargs(self):
kwargs = super(YourView, self).get_form_kwargs()
kwargs.update({'user': self.request.user})
return kwargs
Problem
I have a model along with a ModelForm based on that model. The ModelForm contains a ModelMultipleChoice field, which I specify in the subclass of my ModelForm: ``` class TransactionForm(ModelForm): class Meta: model = Transaction def __init__(self, *args, **kwargs): super(TransactionForm, self).__init__(*args, **kwargs) self.fields['category'] = forms.ModelChoiceField(queryset=Category.objects.filter(user=user)) ``` As you can see, I need to filter the Category queryset by user. In other words, users should only see their own categories on the drop down. But how can I do this when user, or more specifically, request.user, is not available in a Model instance? Edit: Adding my subclass of the CBV: ``` class TransUpdateView(UpdateView): form_class = TransactionForm model = Transaction template_name = 'trans_form.html' success_url='/view_trans/' def get_context_data(self, **kwargs): context = super(TransUpdateView, self).get_context_data(**kwargs) context['action'] = 'update' return context ``` I tried `form_class = TransactionForm(user=request.user)` and I'm getting a NameError saying that request was not found.