【问题标题】:Write Persian in slug and use it in address bar in django在 slug 中编写波斯语并在 django 的地址栏中使用它
【发布时间】:2017-12-22 08:59:50
【问题描述】:

我使用 django 并且在我的模型中我想在 slugfield 中编写波斯语(通过使用 utf-8 或其他东西)并在页面地址中使用 slug 我为模型编写这个类:

class Category(models.Model):
    name = models.CharField(max_length=20, unique=True)
    slug = models.SlugField(max_length=20, unique=True)
    description = models.CharField(max_length=500)
    is_active = models.BooleanField(default=False)
    meta_description = models.TextField(max_length=160, null=True, blank=True)
    meta_keywords = models.TextField(max_length=255, null=True, blank=True)
    user = models.ForeignKey(settings.AUTH_USER_MODEL)

    def save(self, *args, **kwargs):
        self.slug = slugify(self.name)
        super(Category, self).save(*args, **kwargs)

    def __str__(self):
        return self.name

    def category_posts(self):
        return Post.objects.filter(category=self).count()

但是保存后 slug 列中没有任何内容,我不知道在 url 中写什么来显示波斯语。你能告诉我该怎么做吗?

我使用 django 1.9 和 python 3.6。

【问题讨论】:

    标签: python django persian


    【解决方案1】:

    slugify 函数的docstring 是:

    如果 'allow_unicode' 为 False,则转换为 ASCII。将空格转换为连字符。 删除不是字母数字、下划线或连字符的字符。 转换为小写。还要去除前导和尾随空格。

    因此您需要将allow_unicode 标志设置为True 以保留波斯文本。

    >>> text = 'سلام عزیزم! عزیزم سلام!'
    >>> slugify(text)
    ''
    >>> slugify(text, allow_unicode=True)
    'سلام-عزیزم-عزیزم-سلام'
    >>> 
    

    【讨论】:

      【解决方案2】:

      这样更好!!

      ‍‍‍slug = models.SlugField(max_length=20, unique=True, allow_unicode=True)
      

      【讨论】:

      • 你能在你的回答中解释为什么“这更好!!”吗?
      【解决方案3】:

      这是一个您可以用于这种情况的示例:

      如果没有安装django_extensions,请先安装pip

      from django_extensions.db.fields import AutoSlugField
      from django.utils.text import slugify
      

      在你的类之前的model.py中添加这个函数:

      def my_slugify_function(内容): 返回 slugify(content, allow_unicode=True)

      在您的班级中添加此字段:

      slug = AutoSlugField(populate_from=['name'], unique=True, allow_unicode=True, slugify_function=my_slugify_function)

      在url中必须使用这种格式:

      re_path('person_list/(?P<slug>[-\w]+)/', views.detail, name='detail')
      

      【讨论】:

        猜你喜欢
        • 2020-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-18
        相关资源
        最近更新 更多