我已將自定義頁面模型(博客文章)定義為父模型(博客索引頁面)的子模型,并且我想測驗是否可以在其父模型下創建子模型。
BlogPage 和 BlogIndexPage 模型是從檔案中的 wagtail “基本博客”示例復制而來的,并且可以按預期作業。
我正在嘗試遵循檔案,但出現以下錯誤:
AssertionError: Creating a page failed for an unknown reason
通過反復試驗,我知道錯誤是由InlinePanel參考另一個模型(BlogPageGalleryImage)的參考引起的。如果我從我的 BlogPost 模型定義中洗掉此面板,則測驗將通過。我不明白為什么包含面板會導致錯誤,或者如何解決這個問題。
任何幫助深表感謝!
有問題的行:
...
InlinePanel("gallery_images", label="Gallery images"),
...
型號:
class BlogIndexPage(Page):
template = "blog.html"
intro = models.TextField(blank=True)
subpage_types = ["cms.BlogPage", "cms.SimpleBlogPage", "cms.BlogTagIndexPage"]
def get_context(self, request):
# Update context to include only published posts, ordered by reverse-chron
context = super().get_context(request)
blogpages = self.get_children().live().order_by("-first_published_at")
context["blogpages"] = blogpages
return context
content_panels = Page.content_panels [FieldPanel("intro", classname="full")]
class BlogPage(Page):
template = "blog-post.html"
parent_page_types = ["cms.BlogIndexPage"]
date = models.DateField("Post date")
intro = models.CharField(max_length=250)
body = RichTextField(blank=True)
tags = ClusterTaggableManager(through=BlogPageTag, blank=True)
categories = ParentalManyToManyField("cms.BlogCategory", blank=True)
def main_image(self):
gallery_item = self.gallery_images.first()
if gallery_item:
return gallery_item.image
else:
return None
search_fields = Page.search_fields [
index.SearchField("intro"),
index.SearchField("body"),
]
content_panels = Page.content_panels [
MultiFieldPanel(
[
FieldPanel("date"),
FieldPanel("tags"),
FieldPanel("categories", widget=forms.CheckboxSelectMultiple),
],
heading="Meta data",
),
FieldPanel("intro"),
FieldPanel("body"),
InlinePanel("gallery_images", label="Gallery images"),
]
class BlogPageGalleryImage(Orderable):
page = ParentalKey(BlogPage, on_delete=models.CASCADE, related_name="gallery_images")
image = models.ForeignKey("wagtailimages.Image", on_delete=models.CASCADE, related_name=" ")
caption = models.CharField(blank=True, max_length=250)
panels = [
ImageChooserPanel("image"),
FieldPanel("caption"),
]
考試:
class MyPageTests(WagtailPageTests):
def setUp(self):
self.login()
indexPage = BlogIndexPage(title="Home page", path="blog", pk=1, depth=1)
indexPage.save()
page = BlogPage(
title="a blog post", intro="an intro", path="blog/post", depth=2, date="2022-02-23"
)
page.save()
image = Image(height=1, width=1)
image.save()
galleryImage = BlogPageGalleryImage(pk=1, page=page, image=image, caption="foo")
galleryImage.save()
category = BlogCategory(name="cat1", pk=1)
category.save()
def test_create_blog_post(self):
root_page = BlogIndexPage.objects.first()
data = {
"date": datetime.date(2022, 2, 28),
"title": "the title",
"intro": "the intro",
"depth": 2,
}
self.assertCanCreate(root_page, BlogPage, data)
uj5u.com熱心網友回復:
傳遞給assertCanCreate的資料是由“創建”視圖處理的 HTTP 表單提交資料的字典。當您將 InlinePanel 作為創建表單的一部分時 - 即使您沒有向其中傳遞任何資料 - 也需要存在一組額外的表單欄位,以告訴它正在提交多少子表單。
您可以使用 Wagtail 的測驗實用程式中的inline_formset助手(與nested_form_data將嵌套結構扁平化為一組普通表單欄位的助手一起)來構建兼容的表單提交:
from wagtail.tests.utils.form_data import inline_formset, nested_form_data
class MyPageTests(WagtailPageTests):
# ...
def test_create_blog_post(self):
root_page = BlogIndexPage.objects.first()
data = nested_form_data({
"date": datetime.date(2022, 2, 28),
"title": "the title",
"intro": "the intro",
"gallery_images": inline_formset([])
})
self.assertCanCreate(root_page, BlogPage, data)
(您不需要包含depth在表單提交中,因為這是一個內部資料庫欄位,用于跟蹤頁面在頁面樹中的位置 - 并且在assertCanCreate您指定root_page為父頁面時已經在呼叫中處理了.)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/441641.html
上一篇:在多執行緒中拆分nunit測驗
