Я также пытался решить эту проблему, и есть мое решение - в моем случае мне нужно было отрицать любые изменения в related_objects, если main_object заблокирован для редактирования.
1) пользовательское исключение
class Error(Exception):
"""Base class for errors in this module."""
pass
class EditNotAllowedError(Error):
def __init__(self, msg):
Exception.__init__(self, msg)
2) метакласс с пользовательским методом сохранения - все мои модели related_data будут основаны на этой:
class RelatedModel(models.Model):
main_object = models.ForeignKey("Main")
class Meta:
abstract = True
def save(self, *args, **kwargs):
if self.main_object.is_editable():
super(RelatedModel, self).save(*args, **kwargs)
else:
raise EditNotAllowedError, "Closed for editing"
3) метаформе - все мои формы администратора related_data будут основываться на этом (это обеспечитэтот интерфейс администратора будет информировать пользователя без ошибки интерфейса администратора):
from django.forms import ModelForm, ValidationError
...
class RelatedModelForm(ModelForm):
def clean(self):
cleaned_data = self.cleaned_data
if not cleaned_data.get("main_object")
raise ValidationError("Closed for editing")
super(RelatedModelForm, self).clean() # important- let admin do its work on data!
return cleaned_data
На мой взгляд, это не так много накладных расходов и все же довольно просто и легко обслуживаемо.