在Django管理员中验证两个内联模型

时间:2019-06-22 21:51:01

标签: python django

我有三个看起来像这样的模型(从实际模型简化):

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管理员中工作即可。

0 个答案:

没有答案