我有三个看起来像这样的模型(从实际模型简化):
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管理员中工作即可。