如何使用Django管理表单验证多个字段

时间:2019-08-01 02:05:11

标签: django django-forms

我有两个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将数据添加到模型中。 CollectionDocumentCollectionAdmin页中的内联,如下所示。 Admin screen shot of the models

我要解决的问题是如何从此屏幕验证数据。我有一些验证器,它们的工作是确保page_rowpage_col不大于集合中定义的行数和列数。

困扰我的一个验证是如何同时验证三个值-pagepage_rowpage_column?集合的验证逻辑是:对于给定的页面和集合,不会跳过page_rowspage_columns,并且对于该页面和集合,不会重复page_rowpage_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_rowpage_col信息。收款人一无所知CollectionDocument

任何建议将不胜感激!

谢谢!

1 个答案:

答案 0 :(得分:0)

我唯一想到的方法是重写add_view类的change_viewCollectionAdmin。这需要原始请求,并开始了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