У меня есть три модели, которые выглядят так (упрощенно от реальных моделей):
class LayoutPage(models.Model):
name = models.CharField(max_length=190, unique=True)
height = models.DecimalField(max_digits=10, decimal_places=4)
width = models.DecimalField(max_digits=10, decimal_places=4)
class PageImage(models.Model):
page = models.ForeignKey(LayoutPage)
name = models.CharField(max_length=150)
class Meta:
unique_together = ('page', 'name')
class PageText(models.Model):
page = models.ForeignKey(LayoutPage)
name = models.CharField(max_length=150)
class Meta:
unique_together = ('page', 'name')
Мои определения администратора выглядят так:
class PageImageInline(admin.TabularInline):
model = PageImage
form = PageImageForm
class PageTextInline(admin.TabularInline):
model = PageText
form = PageTextForm
class LayoutPageAdmin(admin.ModelAdmin):
inlines = [PageImageInline, PageTextInline]
И мои формы выглядят так:
class PageImageForm(forms.ModelForm):
def clean(self):
cleaned_data = super(PageImageForm, self).clean()
page = cleaned_data.get('page')
name = cleaned_data.get('name')
if page.pagetext_set.filter(name=name).exists():
self.add_error('name', forms.ValidationError(_('Cannot be the same name as an existing layout text on the page'), code='name_conflict'))
class PageTextForm(forms.ModelForm):
def clean(self):
cleaned_data = super(PageTextForm, self).clean()
page = cleaned_data.get('page')
name = cleaned_data.get('name')
if page.pageimage_set.filter(name=name).exists():
self.add_error('name', forms.ValidationError(_('Cannot be the same name as an existing layout image on the page'), code='name_conflict'))
Это выполняет две из трех необходимых мне вещей.
1) Для каждой страницы не может быть двух изображений с одинаковыми именами, и два текста не могут иметь одинаковых имен.
2) При редактировании страницы в администраторе нельзя переименовать изображение, имеющее то же имя, что и существующий текст, или текст, имя которого совпадает с именем существующего изображения.
Однако мне это также нужно для
3) Не разрешать создание изображения и текста с одинаковыми именами ни при создании страницы, ни при добавлении изображения и текста одновременно.
Есть ли способ сделать это?Работать нужно только в админке Django.