【问题标题】:create unique slug django创建独特的 slug django
【发布时间】:2015-02-26 04:11:37
【问题描述】:

我在使用 django 模型创建独特的 slug 时遇到问题。我想允许管理员用户从管理员的编辑页面更改 slug。当 slug 已经存在时,应该有“slug + _1”、“slug + _2”等。此外,当创建一个新页面并且没有 slug 时,slug 应该是页面标题。我有这个代码,但由于某种原因,管理员一直说“带有这个 Slug 的页面已经存在”。当我添加一个带有已经存在的 slug 的页面时。希望有人可以帮助我

def save(self, *args, **kwargs):
    if not self.id and not self.slug:
        self.slug = slugify(self.page_title)

    else:
        self.slug = slugify(self.slug)

    slug_exists = True
    counter = 1
    slug = self.slug
    while slug_exists:
        try:
            slug_exits = Page.objects.get(slug=slug)
            if slug_exits == slug:
                slug = self.slug + '_' + str(counter)
                counter += 1
        except:
            self.slug = slug
            break
    super(Page, self).save(*args, **kwargs)

【问题讨论】:

  • 你的意思是写self.slug = self.slug + '_' + str(counter)而不是slug = self.slug + '_' + str(counter)
  • 不会覆盖 var slug,因此它可以搜索 page_1 或 page_2 等。当找不到时,except 应该给 self.slug 一个 slug。
  • 这不是您问题的确切答案,但可能值得一试:pypi.python.org/pypi/django-autoslug
  • 谢谢,这样更好

标签: python django unique slug


【解决方案1】:

试试这个。自己没有测试。但它应该给你的想法。

import re
def save(self, *args, **kwargs):
    if not self.id: # Create
        if not self.slug: # slug is blank
            self.slug = slugify(self.page_title)
        else: # slug is not blank
            self.slug = slugify(self.slug)
    else: # Update
        self.slug = slugify(self.slug)

    qsSimilarName = Page.objects.filter(slug__startswith='self.slug')

    if qsSimilarName.count() > 0:
        seqs = []
        for qs in qsSimilarName:
            seq = re.findall(r'{0:s}_(\d+)'.format(self.slug), qs.slug)
            if seq: seqs.append(int(seq[0]))

        if seqs: self.slug = '{0:s}_{1:d}'.format(self.slug, max(seqs)+1)

    super(Page, self).save(*args, **kwargs)

您的代码中存在三个问题。

  1. 第一个else 表示self.idself.slug 不为空。因此,如果self.id 不为空且self.slug 为空,self.slug 将不会获得值。
  2. slug_exits == slug 将始终为 False,因为 slug_exits 是一个模型对象,slug 是一个字符串。 这就是您收到错误的原因!
  3. 您在循环中进行了查询,这可能会导致对数据库的大量命中。

【讨论】:

    猜你喜欢
    • 2017-06-01
    • 1970-01-01
    • 2011-10-29
    • 2014-11-06
    • 2016-05-17
    • 1970-01-01
    • 2011-04-21
    • 2010-10-24
    • 1970-01-01
    相关资源
    最近更新 更多