# You can either pass a list of values to be disabled i.e # def __init__(self, disabled_choices, *args, **kwargs): # self._disabled_choices = disabled_choices # OR from django.forms import Select class SelectWidget(Select): """ Subclass of Django's select widget that allows disabling options. """ def __init__(self, *args, **kwargs): self._disabled_choices = [] super().__init__(*args, **kwargs) @property def disabled_choices(self): return self._disabled_choices @disabled_choices.setter def disabled_choices(self, other): self._disabled_choices = other def create_option(self, name, value, *args, **kwargs): option_dict = super().create_option(name, value, *args, **kwargs) if value in self.disabled_choices: option_dict['attrs']['disabled'] = 'disabled' return option_dict # To disabled an option based on a condition i.e user isn't a superuser. class MyForm(forms.Form): status = forms.ChoiceField(required=True, widget=SelectWidget, choices=Status.choices()) def __init__(self, request, *args, **kwargs): if not request.user.is_superuser: self.fields['status'].widget.disabled_choices = [1, 4] super().__init__(*args, **kwargs)