Первый набор обязателен = False для полей, которые не нужно устанавливать, если вы сохраняете как черновик. Затем к вашей форме добавьте поле типа 'save_as_draft', которое является логическим. Теперь вам нужен метод для проверки этих полей в зависимости от состояния поля save_as_draft (независимо от того, проверил ли пользователь это поле или нет). Вы можете использовать такой метод:
def is_provided(self, field):
value = self.cleaned_data.get(field, None)
if value == None or value == '':
self._errors[field] = ErrorList([u'This field is required.'])
if field in self.cleaned_data:
del self.cleaned_data[field]
Добавьте этот метод в вашу форму и используйте его в чистом методе формы для проверки ваших полей. Это будет выглядеть так:
def clean(self):
draft = self.cleaned_data.get('save_as_draft', False)
if not draft:
# User doesn't save a draft so we need to check if required fields are provided
req_fields = ['field1', 'field2', 'field3']
for f in req_field:
self.is_provided(f)
return self.cleaned_data
Если пользователь предпочитает кнопку save_as_draft вместо флажка, то вам необходимо изменить представление и передать какой-либо параметр конструктору формы в зависимости от того, нажал ли пользователь кнопку save_as_draft или просто кнопку сохранения. В конструкторе формы сохраните это состояние как self.save_as_draft и используйте его в методе Form.clean, чтобы проверить, сохраняете ли вы черновик или нет.
Привет,
Лукаш