Поскольку я не получил ответа от Botondus, я решил задать новый вопрос в Django Users Google Group и, наконец, получил ответ от jaymz.
Я понял, что Botondusметод был правильным способом сделать это, он просто не совсем работал.Причина, по которой это не работает в этом случае, заключается в том, что я использую модель Сквозного поля для поля, на котором я хотел бы выполнить проверку.Из-за некоторых предыдущих отзывов, которые я получил по ранее опубликованному вопросу, я понял, что сначала сохраняется экземпляр Application, а затем - экземпляры ManyToMany (я считаю, что это правильно, но поправьте меня, если я ошибаюсь).Поэтому я подумал, что, если я выполню проверку поля ManyToMany в сквозной модели, это не помешает сохранению экземпляра приложения.Но на самом деле это предотвращает это.
Таким образом, если у вас есть встроенное поле ManyToMany в администраторе вашей модели и вы хотите выполнить проверку этого поля, вы задаете чистую функцию в сквозной модели, например:
admin.py
class PermissionInline(admin.TabularInline):
form = PermissionForm
model = Permission
extra = 3
forms.py
class PermissionForm(forms.ModelForm):
class Meta:
model = Permission
def clean(self):
cleaned_data = self.cleaned_data
user = cleaned_data['user']
role = cleaned_data['role']
if role.id != 1:
folder = cleaned_data['application'].folder
if len(filter(lambda x:x in user.profile.company.all(),folder.company.all())) > 0: # this is an intersection
raise forms.ValidationError("One of the users of this Application works for one of the Repository's organisations!")
return cleaned_data
Если проверка приводит к ошибке, НИЧЕГО (ни экземпляр приложения, ни множество пользователей) не сохраняется, и вы получаете возможность исправить ошибку.