Skip to content

Instantly share code, notes, and snippets.

@aliceridgway
Created September 27, 2020 09:43
Show Gist options
  • Save aliceridgway/d14094d476beaee7807862420042e2b6 to your computer and use it in GitHub Desktop.
Save aliceridgway/d14094d476beaee7807862420042e2b6 to your computer and use it in GitHub Desktop.
How to use the user object in Django forms. Used when choices in a multi-select-field are unique to a given user.
from django import forms
from .models import Meal
from core.models import Member
class CustomModelMultipleChoiceField(forms.ModelMultipleChoiceField):
def label_from_instance(self, member):
return "%s" % member.name
class CreateMealForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
""" Grants access to the request object so that only members of the current user
are given as options"""
self.request = kwargs.pop('request')
super(CreateMealForm, self).__init__(*args, **kwargs)
self.fields['members'].queryset = Member.objects.filter(
user=self.request.user)
class Meta:
model = Meal
fields = ['name', 'date', 'members']
name = forms.CharField()
date = forms.DateInput()
members = CustomModelMultipleChoiceField(
queryset=None,
widget=forms.CheckboxSelectMultiple
)
class AddMeal(CreateView):
model = Meal
form_class = CreateMealForm
template_name = 'meals/add_meal.html'
success_url = reverse_lazy('index')
def get_form_kwargs(self):
""" Passes the request object to the form class.
This is necessary to only display members that belong to a given user"""
kwargs = super(AddMeal, self).get_form_kwargs()
kwargs['request'] = self.request
return kwargs
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment