【发布时间】:2017-05-18 04:38:37
【问题描述】:
我有两个模型,Book 和Page,其中Page 与Book 有外键关系。在 admin.py 中,修改书籍的网页包含 Page 对象的内联元素。
models.py:
class Book(models.Model):
# ...
class Page(models.Model):
book = models.ForeignKey(Book, editable=False)
number = models.IntegerField('Page number')
# ...
admin.py:
class PageAdminInline(admin.TabularInline):
model = Page
extra = 1
class BookAdmin(admin.ModelAdmin):
inlines = [PageAdminInline]
admin.site.register(Book, BookAdmin)
在内联表单中,字段允许设置每页的页码。使用此配置,我如何验证一本书的所有页码应该不同并且编号从一到与该书关联的Page 对象数的全局条件?
我想我必须在某处覆盖与书籍模型或表单相关的clean() 方法,但我不知道如何从那里访问与用户输入的页面相关的数据。
编辑
根据 Emett 的建议,我尝试重写 Page 模型的 clean() 方法:
class Page(models.Model):
book = models.ForeignKey(Book, editable=False)
number = models.IntegerField('Page number')
def clean():
book_pages = Page.objects.filter(book=self.book)
# ... [apply condition on the book_pages QuerySet]
super(Page, self).clean()
这不起作用:如果我修改一本书的管理站点中所有页面的页码,book_pages 将包含具有旧页码的对象。
另外,在Page中检查条件也意味着如果我有n个页面,它将被测试n次,而只检查一次就足够了。
【问题讨论】:
-
这需要在您的
models.py中完成。能否提供模型? -
@EmettSpeer 你确定吗?在models.py 中,我需要访问
Page对象的Book方法实例,这些对象在验证时未保存到数据库中。 -
当您在数据库中保存新页面时,您需要该页面附有书籍。这将是让系统执行此逻辑的正确时机。
unique-together似乎是解决这个问题的正确选择。 docs.djangoproject.com/en/1.10/ref/models/options/… -
谢谢,我会看看是否可以通过更改
Page模型使其工作。 unique-together 看起来是一个非常好的建议。然而,书页问题只是一个例子,我要验证的条件比只有不同的页码更复杂!
标签: django django-admin django-validation