我正在尝试创建一个blog,其中blog-post将包含以下代码: example.com/blog/title-01012021/,其中date -是发布日期。如何覆盖默认的wagtail slug生成?
Wagtail提供了几种方法来检查slug可用性和生成独特的slug:
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")}) 我不知道如何在我的应用程序中覆盖这些方法。
发布于 2021-11-24 23:10:24
我找到了适合我的解决方案。Unidecode是用于Cyrillic弹头的。
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"),
]发布于 2021-11-16 08:21:51
您可以使用的一种方法是在模型的save方法中执行一些自定义工作
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)发布于 2021-11-19 13:39:21
在保存对象之前,您可以使用Django Signals更改插件,如下所示:
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更改为您想要更改其插件的任何特定型号。
https://stackoverflow.com/questions/69973565
复制相似问题