所以我的问题是如何为CMS生成随机UID或slug。如果我使用来自API v2的默认id,人们可以很容易地猜测我的下一篇文章的URL。
有没有办法为我的wagtail CMS添加一个唯一的slug/ID/UUID?
这是一个简单的解决方案,转到您的bolg/models.py
并首先安装pip install django-autoslug
然后导入这个
from django.db.models import CharField, Model
from autoslug import AutoSlugField
from django.utils.crypto import get_random_string
在这里,我们添加了另一个名为get_random_string
的扩展,每次调用它时都会生成一个随机字符串
然后将其添加到您的AddStory
{您的添加帖子类}中
#Defining a function to get random id every call
def randomid(self):
return(get_random_string(length=10))
# creating a custom slug to show in frontend.
news_slug = AutoSlugField(populate_from='randomid', unique = True, null= True, default=None)
在这里,我定义了一个名为randomid
的函数,它将在每次调用时返回一个10位数的字符串。然后,我创建了一个名为news_slug的新字段,它来自Django auto_slug扩展,它将从随机化中填充,并且URL必须是唯一的(例如:如果所有10位字符串都完成了,它将添加-1、-2,依此类推(例如:sxcfsf12e4-1(,这里null = true
意味着这个字段可以为空,这样autoslug就可以生成唯一的ID。
然后公开在API中提交的news_slug
。
api_fields=[
APIField("news_slug"),
]
你可以访问像这个/api/v2/pages/?type=blog.AddStory&fields=*
这样的所有字段
这里type=blog是你的blog
应用程序,AddStory
是你的课程。
希望这能有所帮助,我花了一些时间才发现。更多的wagtail教程将会到来。
我用于用户ID的答案的变体:
import random
import string
from django_extensions.db.fields import AutoSlugField
....
class CustomUser(AbstractUser):
....
uuid = AutoSlugField(unique=True)
....
def slugify_function(self, content):
return ''.join((random.choice(string.ascii_letters + string.digits) for i in range(12)))
- AutoSlugField是django_extensions的一部分
- AutoSlugField有一个内置的slugify_函数来生成slug,您可以通过在类中声明自己的函数来覆盖它
- 此slugify_函数将生成一个随机的12个字母数字字符串,包括大小写。排列是(我认为(1e21,所以猜测的机会非常渺茫