Тестирование 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.

Вернуться на верх