gpt4 book ai didi

django - 在 Django 管理中验证依赖于外键的条件

转载 作者:行者123 更新时间:2023-12-03 18:35:49 25 4
gpt4 key购买 nike

我有两个模型,BookPage,其中 PageBook 有外键关系。在 admin.py 中,修改书籍的网页具有 Page 对象的内联元素。

模型.py:

class Book(models.Model):
# ...

class Page(models.Model):
book = models.ForeignKey(Book, editable=False)
number = models.IntegerField('Page number')
# ...

管理员.py:

class PageAdminInline(admin.TabularInline):
model = Page
extra = 1

class BookAdmin(admin.ModelAdmin):
inlines = [PageAdminInline]

admin.site.register(Book, BookAdmin)

在内联表单中,一个字段允许为每一页设置页码。使用此配置,我如何验证全局条件,即一本书的所有页码都应该不同,并且编号从 1 到与该书关联的 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次,而只检查一次就足够了。

最佳答案

一个更简单的解决方案是将 unique_together 放在 django 模型中。浏览器

class Page(models.Model):
book = models.ForeignKey(Book, editable=False)
number = models.IntegerField('Page number')

class Meta:
app_label = 'page'
db_table = 'pages'
verbose_name = 'Page'
verbose_name_plural = 'Pages'
unique_together = (('book', 'number'),)

另一种解决方法,如果您不想使用 unique_together,则创建一个表单,以内联方式使用它,即:

class PageForm(forms.ModelForm):
class Meta:
model = Page
fields ='__all__'

def clean():
cleaned_data = self.cleaned_data
book = cleaned_data.get('book')
number = cleaned_data.get('number')
page_qset = Page.objects.filter(book=book, number=number)

if len(page_qset) > 0: # inefficient solution, using it for forcibly executing query
raise forms.ValidationError('Already exists')
return super().clean()



class PageAdminInline(admin.TabularInline):
form = PageForm

关于django - 在 Django 管理中验证依赖于外键的条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41454492/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com