Предыдущий ответ сработает, но мне нравится инкапсулировать все внутренние операции формы, например, что показывать, а что нет, внутри формы. Я знаю, что вы упомянули, что не хотите отправлять значение поля конструктору, но если вы не возражаете против отправки пользователя, ваше решение будет работать.
т. е. ваш конструктор:
def __init__(self, user):
self.user = user
super(BaseForm, self).__init__()
тогда в вашей чистоте вы просто меняете user
на self.user
.
Есть еще одно дополнительное преимущество в этом. Скажем, завтра вы хотите назначить больше полей в зависимости от вашего пользователя, вам не нужно ничего добавлять к представлениям, вы можете просто добавить это к форме.
EDIT:
Когда вы добавляете поле для исключения, оно не доступно в очищенных данных. Вместо этого установите его виджет как скрытый.
active = forms.BooleanField(widget=forms.HiddenInput)
РЕДАКТИРОВАТЬ 2: Если вы действительно не хотите, чтобы поле в форме
В этом случае, вместо переопределения очистки, почему бы вам не переопределить сохранение?
def save (self):
super(BaseForm, self).save()
if user.is_admin():
self.instance.active=True
super(BaseForm, self).save()