首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何覆盖默认的wagtail slug生成?

如何覆盖默认的wagtail slug生成?
EN

Stack Overflow用户
提问于 2021-11-15 11:18:54
回答 3查看 105关注 0票数 0

我正在尝试创建一个blog,其中blog-post将包含以下代码: example.com/blog/title-01012021/,其中date -是发布日期。如何覆盖默认的wagtail slug生成?

Wagtail提供了几种方法来检查slug可用性和生成独特的slug:

代码语言:javascript
复制
def _slug_is_available(slug, parent_page, page=None):
    if parent_page is None:
        # the root page's slug can be whatever it likes...
        return True

    siblings = parent_page.get_children()
    if page:
        siblings = siblings.not_page(page)

    return not siblings.filter(slug=slug).exists()

def _get_autogenerated_slug(self, base_slug):
    candidate_slug = base_slug
    suffix = 1
    parent_page = self.get_parent()

    while not Page._slug_is_available(candidate_slug, parent_page, self):
        # try with incrementing suffix until we find a slug which is available
        suffix += 1
        candidate_slug = "%s-%d" % (base_slug, suffix)

    return candidate_slug

def full_clean(self, *args, **kwargs):
    # Apply fixups that need to happen before per-field validation occurs

    if not self.slug:
        # Try to auto-populate slug from title
        allow_unicode = getattr(settings, 'WAGTAIL_ALLOW_UNICODE_SLUGS', True)
        base_slug = slugify(self.title, allow_unicode=allow_unicode)

        # only proceed if we get a non-empty base slug back from slugify
        if base_slug:
            self.slug = self._get_autogenerated_slug(base_slug)

    if not self.draft_title:
        self.draft_title = self.title

    # Set the locale
    if self.locale_id is None:
        self.locale = self.get_default_locale()

    super().full_clean(*args, **kwargs)

def clean(self):
    super().clean()
    if not Page._slug_is_available(self.slug, self.get_parent(), self):
        raise ValidationError({'slug': _("This slug is already in use")}) 

我不知道如何在我的应用程序中覆盖这些方法。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-11-24 23:10:24

我找到了适合我的解决方案。Unidecode是用于Cyrillic弹头的。

代码语言:javascript
复制
from unidecode import unidecode
from django.template import defaultfilters


class HomePage(Page):
    date_published = models.DateField(blank=True, null=True)
    content = .....

    def clean(self):
        super().clean()
        date = '{:%Y-%m-%d}'.format(self.date_published)
        base_slug = defaultfilters.slugify(unidecode(self.title))
        self.slug = "%s-%s" % (base_slug, date)

    date_widget = widgets.AdminDateInput(
        attrs = {
            'placeholder': 'yyyy-mm-dd'
        }
    )

    content_panels = Page.content_panels + [
        FieldPanel('date_published', widget=date_widget),
        StreamFieldPanel('content', classname="full"),
    ]
票数 0
EN

Stack Overflow用户

发布于 2021-11-16 08:21:51

您可以使用的一种方法是在模型的save方法中执行一些自定义工作

代码语言:javascript
复制
def some_date_method(self):
    return datetime.datetime.now()


def save(self, *args, **kwargs):
    self.slug = f"{slugify(self.title)}-{self.some_date_method()}"
    super().save(*args, **kwargs)
票数 0
EN

Stack Overflow用户

发布于 2021-11-19 13:39:21

在保存对象之前,您可以使用Django Signals更改插件,如下所示:

代码语言:javascript
复制
from django.db.models.signals import pre_save
@receiver(pre_save)
def set_slug_on_new_instance(sender, instance, **kwargs):
    if isinstance(instance, Page):
       instance.slug = Whatever value you want

此外,您还可以将Page更改为您想要更改其插件的任何特定型号。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69973565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档