Created
September 27, 2020 09:43
-
-
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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