从 Page.promote_panels 中删除 slug 后出现错误 [Django Wagtail]

问题描述 投票:0回答:1

Page.promote_panels
中删除“slug”字段后,我收到以下错误。

我正在使用 wagtail 5.1。

KeyError at /admin/pages/add/blog/blogdetailpage/10/
"Key 'slug' not found in 'BlogDetailPageForm'. Choices are: category, classes, comment_notifications, container_size, containerized, content, expire_at, go_live_at, publish_at, search_description, seo_title, site, title."

我正在使用以下代码自动生成 slug,因此我认为不需要保留它。

class BlogDetailPage(Page):
    """Parental Blog Detail Page."""
    template = "blog/blog_detail_page.html"


    site = models.ForeignKey(
        "wagtailcore.Site",
        null=True,
        blank=True,
        on_delete=models.SET_NULL,
        related_name="+",
        help_text="Select a site where this will be visible. \nLeave blank to make page visible on all sites.",
    )
    container_size = models.CharField(
        choices=container_sizes,
        null=True,
        blank=True,
        max_length=255,
    )
    classes = models.CharField(max_length=255, null=True, blank=True)

    objects = BlogDetailManager()

    content = fields.StreamField([
        ("section", Section()),
        ("spacer", Spacer()),
        ("filler", Filler()),
        ("banner", Banner()),
        ("column_two", ColumnTwo()),
        ("heading", Heading()),
        ("rich_text", SafeTextBlock()),
    ], use_json_field=True, blank=True)

    content_panels = Page.content_panels + [
        MultiFieldPanel([
            FieldPanel("classes"),
            FieldPanel("containerized"),
            FieldPanel("container_size"),
        ], heading="Container"),
        FieldPanel("content"),
    ]

    category = models.ForeignKey(
        "blog.BlogCategory",
        null=True,
        blank=True,
        on_delete=models.SET_NULL,
        related_name="+",
    )

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    publish_at = models.DateTimeField(auto_now=False, auto_now_add=False, null=True, blank=True)

    promote_panels = [
        FieldPanel("site"),
        FieldPanel("publish_at"),
        FieldPanel("category"),
    ]

    settings_panels = Page.settings_panels + [
        FieldPanel("seo_title"),
        FieldPanel("search_description"),
    ]


    parent_page_types = [
        'blog.BlogListingPage',
    ]
    subpage_types = []

    class Meta:
        verbose_name = "Blog Detail Page"
        verbose_name_plural = "Blog Detail Pages"
        ordering = ["-publish_at"]

    def save(self, request=None, *args, **kwargs):
        if request and not (
                # cast to true boolean
                not not self.site or 
                not not self.site_id):

            self.site = Site.find_for_request(request)

        slug = slugify(f"{self.title}-{self.created_at}")
        if not self.slug or self.slug != slug:
            self.slug = slug
        if not self.publish_at:
            self.publish_at = datetime.now()
        super().save(*args, **kwargs)

有人熟悉这样做吗?

编辑

模型管理员:

from wagtail.contrib.modeladmin.options import ModelAdmin, modeladmin_register
from wagtail.models import Site
from .models import BlogDetailPage
from django.db.models import Q

class BlogDetailPageAdmin(ModelAdmin):
    model = BlogDetailPage

    add_to_settings_menu = False 

    def get_queryset(self, request):
        qs = super().get_queryset(request)
        if request.user.is_superuser:
            return qs
        
        filterQuery = Q(site=Site.find_for_request(request)) | Q(site__isnull=True)
        if not request.user.is_superuser:
            filterQuery = filterQuery | Q(owner=request.user)

        return qs.filter(filterQuery)
    
modeladmin_register(BlogDetailPageAdmin)

回溯:

Template error:
In template C:\Users\Nigel\site\env\Lib\site-packages\wagtail\admin\templates\wagtailadmin\panels\object_list.html, error at line 9
   Key 'slug' not found in 'BlogDetailPageForm'. Choices are: category, classes, comment_notifications, container_size, containerized, content, expire_at, go_live_at, publish_at, search_description, seo_title, site, title.
   1 : {% load wagtailadmin_tags %}
   2 : 
   3 : <div class="w-form-width" {% include "wagtailadmin/shared/attrs.html" with attrs=self.attrs %}>
   4 :     {% if self.help_text %}
   5 :         {% help_block status="info" %}{{ self.help_text }}{% endhelp_block %}
   6 :     {% endif %}
   7 :     {% for child, identifier in self.visible_children_with_identifiers %}
   8 :         {% panel id_prefix=self.prefix id=identifier classname=child.classes|join:' ' attrs=child.attrs heading=child.heading heading_size="label" icon=child.icon id_for_label=child.id_for_label is_required=child.is_required %}
   9 :              {% component child %} 
   10 :         {% endpanel %}
   11 :     {% endfor %}
   12 : </div>
   13 : 

Traceback (most recent call last):
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\forms\forms.py", line 178, in __getitem__
    field = self.fields[name]
            ^^^^^^^^^^^^^^^^^

During handling of the above exception ('slug'), another exception occurred:
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\core\handlers\exception.py", line 55, in inner
    response = get_response(request)
               ^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\core\handlers\base.py", line 220, in _get_response
    response = response.render()
               ^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\wagtail\admin\auth.py", line 184, in overridden_render
    return render()
           ^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\response.py", line 114, in render
    self.content = self.rendered_content
                   ^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\response.py", line 92, in rendered_content
    return template.render(context, self._request)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\backends\django.py", line 61, in render
    return self.template.render(context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 175, in render
    return self._render(context)
           ^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 167, in _render
    return self.nodelist.render(context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 1005, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 1005, in <listcomp>
    return SafeString("".join([node.render_annotated(context) for node in self]))
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 966, in render_annotated
    return self.render(context)
           ^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\loader_tags.py", line 157, in render
    return compiled_parent._render(context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 167, in _render
    return self.nodelist.render(context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 1005, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 1005, in <listcomp>
    return SafeString("".join([node.render_annotated(context) for node in self]))
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 966, in render_annotated
    return self.render(context)
           ^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\loader_tags.py", line 157, in render
    return compiled_parent._render(context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 167, in _render
    return self.nodelist.render(context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 1005, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 1005, in <listcomp>
    return SafeString("".join([node.render_annotated(context) for node in self]))
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 966, in render_annotated
    return self.render(context)
           ^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\loader_tags.py", line 157, in render
    return compiled_parent._render(context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 167, in _render
    return self.nodelist.render(context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 1005, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 1005, in <listcomp>
    return SafeString("".join([node.render_annotated(context) for node in self]))
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 966, in render_annotated
    return self.render(context)
           ^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\loader_tags.py", line 63, in render
    result = block.nodelist.render(context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 1005, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 1005, in <listcomp>
    return SafeString("".join([node.render_annotated(context) for node in self]))
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 966, in render_annotated
    return self.render(context)
           ^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\loader_tags.py", line 63, in render
    result = block.nodelist.render(context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 1005, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 1005, in <listcomp>
    return SafeString("".join([node.render_annotated(context) for node in self]))
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 966, in render_annotated
    return self.render(context)
           ^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\loader_tags.py", line 63, in render
    result = block.nodelist.render(context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 1005, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 1005, in <listcomp>
    return SafeString("".join([node.render_annotated(context) for node in self]))
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 966, in render_annotated
    return self.render(context)
           ^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 1064, in render
    output = self.filter_expression.resolve(context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 715, in resolve
    obj = self.var.resolve(context)
          ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 847, in resolve
    value = self._resolve_lookup(context)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 914, in _resolve_lookup
    current = current()
              ^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\wagtail\admin\panels\base.py", line 317, in render_form_content
    return mark_safe(self.render_html() + self.render_missing_fields())
                     ^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\wagtail\admin\ui\components.py", line 22, in render_html
    return template.render(context_data)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\backends\django.py", line 61, in render
    return self.template.render(context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 175, in render
    return self._render(context)
           ^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 167, in _render
    return self.nodelist.render(context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 1005, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 1005, in <listcomp>
    return SafeString("".join([node.render_annotated(context) for node in self]))
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 966, in render_annotated
    return self.render(context)
           ^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\defaulttags.py", line 238, in render
    nodelist.append(node.render_annotated(context))
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 966, in render_annotated
    return self.render(context)
           ^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\defaulttags.py", line 321, in render
    return nodelist.render(context)
           ^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 1005, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 1005, in <listcomp>
    return SafeString("".join([node.render_annotated(context) for node in self]))
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 966, in render_annotated
    return self.render(context)
           ^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 1064, in render
    output = self.filter_expression.resolve(context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 715, in resolve
    obj = self.var.resolve(context)
          ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 847, in resolve
    value = self._resolve_lookup(context)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 914, in _resolve_lookup
    current = current()
              ^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\wagtail\admin\ui\components.py", line 22, in render_html
    return template.render(context_data)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\backends\django.py", line 61, in render
    return self.template.render(context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 175, in render
    return self._render(context)
           ^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 167, in _render
    return self.nodelist.render(context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 1005, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 1005, in <listcomp>
    return SafeString("".join([node.render_annotated(context) for node in self]))
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 966, in render_annotated
    return self.render(context)
           ^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\defaulttags.py", line 238, in render
    nodelist.append(node.render_annotated(context))
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 966, in render_annotated
    return self.render(context)
           ^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\wagtail\admin\templatetags\wagtailadmin_tags.py", line 1048, in render
    children = self.nodelist.render(context) if self.nodelist else ""
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 1005, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 1005, in <listcomp>
    return SafeString("".join([node.render_annotated(context) for node in self]))
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\base.py", line 966, in render_annotated
    return self.render(context)
           ^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\template\library.py", line 237, in render
    output = self.func(*resolved_args, **resolved_kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\wagtail\admin\templatetags\wagtailadmin_tags.py", line 976, in component
    return obj.render_html(context)
           ^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\wagtail\admin\ui\components.py", line 17, in render_html
    context_data = self.get_context_data(parent_context)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\wagtail\admin\panels\title_field_panel.py", line 60, in get_context_data
    field.widget.attrs.update(**self.get_attrs())
                                ^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\wagtail\admin\panels\title_field_panel.py", line 81, in get_attrs
    targets = [self.get_target_selector(target) for target in panel.targets]
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\wagtail\admin\panels\title_field_panel.py", line 81, in <listcomp>
    targets = [self.get_target_selector(target) for target in panel.targets]
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\wagtail\admin\panels\title_field_panel.py", line 128, in get_target_selector
    field = self.form[target]
            ^^^^^^^^^^^^^^^^^
  File "C:\Users\Nigel\site\env\Lib\site-packages\django\forms\forms.py", line 180, in __getitem__
    raise KeyError(
    ^

Exception Type: KeyError at /admin/pages/14/edit/
Exception Value: "Key 'slug' not found in 'BlogDetailPageForm'. Choices are: category, classes, comment_notifications, container_size, containerized, content, expire_at, go_live_at, publish_at, search_description, seo_title, site, title."
django wagtail
1个回答
0
投票

这并没有深入到您在此处显示的错误的根源。但我建议你将 FieldPanel 中的

slug
Page.promote_panels
保留为 read_only 属性,这样用户就无法对其进行编辑。您还可以利用 permissions 属性,请参阅 documentation

© www.soinside.com 2019 - 2024. All rights reserved.