我有两个Django 2.2模型:
class Collection(Model):
collection_id = models.AutoField(primary_key=True)
name = models.CharField('title', max_length=200)
description = models.TextField('description')
document = models.ManyToManyField(Document, through='CollectionDocument', related_name='collections')
page_rows = models.IntegerField(default=1)
page_columns = models.IntegerField(default=1)
created = models.DateTimeField(auto_now_add=True, editable=False, verbose_name="date created")
updated = models.DateTimeField(auto_now=True, editable=False, verbose_name="last update")
class CollectionDocument(Model):
collection_id = models.ForeignKey(Collection, on_delete=models.CASCADE, )
document = models.ForeignKey(Document, on_delete=models.CASCADE, )
page = models.IntegerField(default=1) # the page for this document
page_row = models.IntegerField(default=1,)
page_column = models.IntegerField(default=1,)
我正在使用Django Admin将数据添加到模型中。 CollectionDocument
是CollectionAdmin
页中的内联,如下所示。
我要解决的问题是如何从此屏幕验证数据。我有一些验证器,它们的工作是确保page_row
和page_col
不大于集合中定义的行数和列数。
困扰我的一个验证是如何同时验证三个值-page
,page_row
和page_column
?集合的验证逻辑是:对于给定的页面和集合,不会跳过page_rows
或page_columns
,并且对于该页面和集合,不会重复page_row
或page_col
给定的集合和页面。
例如,屏幕截图中的“集合”具有2行2列的文档网格。这意味着对于集合中的每个页面,CollectionDocuments
的位置(行,列)分别为(1,1),(1,2),(2,1),(2,2)。因此,内联将针对页面,行,列显示:
document page page_row page_col
doc_1 1 1 1
doc_2 1 1 2
doc_3 1 2 1
doc_4 1 2 2
another entry like this
doc_x 1 2 1
is an error, as the page position (2,1) on page 1 is repeated.
Or, if the doc_3 entry is removed, then there is a missing document
for page 1 at position (2,1)
CollectionDocument
级的干净方法无法访问所有page_row
和page_col
信息。收款人一无所知CollectionDocument
。
任何建议将不胜感激!
谢谢!
答案 0 :(得分:0)
我唯一想到的方法是重写add_view
类的change_view
和CollectionAdmin
。这需要原始请求,并开始了django的魔力。
https://docs.djangoproject.com/en/2.2/ref/contrib/admin/#django.contrib.admin.ModelAdmin.change_view
https://docs.djangoproject.com/en/2.2/ref/contrib/admin/#django.contrib.admin.ModelAdmin.add_view