Проверьте две встроенные модели в админке Django - PullRequest
0 голосов
/ 23 июня 2019

У меня есть три модели, которые выглядят так (упрощенно от реальных моделей):

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...