Тестирование Django Wagtail - утверждение, что дочерняя страница заданного типа Page может быть создана под родительской, используя предоставленные данные POST
Я определил пользовательскую модель страницы (запись в блоге) как дочернюю модель родительской модели (индексная страница блога) и хочу проверить, что дочерняя модель может быть создана под своей родительской моделью.
Модели BlogPage и BlogIndexPage скопированы из примера wagtail "basic blog" в документации, и работают как ожидалось.
Я пытаюсь следовать документации, но получаю следующую ошибку валидации:
AssertionError: Validation errors found when creating a cms.blogpage:
E date:
E This field is required.
E intro:
E This field is required.
E slug:
E This field is required.
E title:
E This field is required.
Я подозреваю, что неправильно определяю свое приспособление, но я не знаю, какова правильная форма. Любая помощь будет высоко оценена! Кто-нибудь может объяснить, почему это не работает?
приспособление (apps.cms.tests.fixtures.blogPage.json):
[
{
"model":"wagtailcore.page",
"pk": 1,
"fields":{
"date":"2022-02-28",
"intro":"intro to the post...",
"slug":"slug/",
"title":"the title",
"body":"body of the post...",
"categories":[
1
],
"content_type": ["cms", "blogpage"],
"depth": 2
}
},
{
"model": "cms.blogpage",
"pk": 1,
"fields": {}
}
]
тестовый класс (apps.cms.tests.test_pages.py):
class MyPageTests(WagtailPageTests):
def setUp(self):
self.login()
page = BlogIndexPage(title="Home page", slug="home", path="foo", depth=1)
page.save()
def test_create_blog_post(self):
cwd = Path.cwd()
root_page = BlogIndexPage.objects.first()
with open(f"{cwd}/lettergun/apps/cms/tests/fixtures/BlogPage.json") as json_file:
fixture = json.load(json_file)
# Assert that a ContentPage can be made here, with this POST data
self.assertCanCreate(root_page, BlogPage, nested_form_data(fixture))
модели (apps.cms.models.py):
class BlogIndexPage(Page):
template = "blog.html"
intro = models.TextField(blank=True)
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 BlogPageTag(TaggedItemBase):
content_object = ParentalKey("BlogPage", related_name="tagged_items", on_delete=models.CASCADE)
class BlogPage(Page):
template = "blog-post.html"
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="Blog information",
),
FieldPanel("intro"),
FieldPanel("body"),
InlinePanel("gallery_images", label="Gallery images"),
]
Последний аргумент self.assertCanCreate - это словарь данных HTTP POST, которые должны быть отправлены в представление администратора 'create page'. Это совершенно другая вещь, чем фикстура (которая является представлением данных страницы, хранящихся в базе данных), и структуры данных несовместимы.
В самом простом случае словарь POST может состоять из обязательных полей date, intro, slug и title:
self.assertCanCreate(root_page, BlogPage, {
'date': '2022-02-28',
'intro': "intro to the post...",
'slug': 'my-blog-page',
'title': 'My blog page',
})
Помощник nested_form_data нужен только в том случае, если ваш тест создает страницу с данными, которые сложнее, чем просто список полей - например, если вы хотите, чтобы данные страницы содержали изображения галереи, вам нужно использовать его вместе с помощником inline_formset.