姜戈。非 ascii 字段不会创建 slug。我希望得到音译,但得到一个空字段和错误

Posted

技术标签:

【中文标题】姜戈。非 ascii 字段不会创建 slug。我希望得到音译,但得到一个空字段和错误【英文标题】:Django. Non-ascii field doesn't create slug. I expect to get transliteration, but getting an empty field and error 【发布时间】:2021-05-03 21:45:34 【问题描述】:

我有简单的模型,带有标题和 slug 字段。我想接受非拉丁字符作为标题并将它们音译成拉丁 slug。具体来说,我想音译西里尔字符,比如“Привет, мир!”转化为拉丁语 'privet-mir' 蛞蝓。而不是蛞蝓我得到以下错误:

/blog/ 上的 NoReverseMatch

未找到带有参数“('',)' 的“blog_detail”的反向操作。 1 尝试的模式:['blog/(?P[-a-zA-Z0-9_]+)/$']

Django Version: 3.1.5
Python Version: 3.9.1
Exception Type: NoReverseMatch
Exception Value:    

Reverse for 'blog_detail' with arguments '('',)' not found. 1 pattern(s) tried: ['blog/(?P<slug>[-a-zA-Z0-9_]+)/$']

型号

from django.db import models 
from django.template.defaultfilters import slugify


class Post(models.Model):
    title = models.CharField(max_length=70)
    slug = models.SlugField(null=False, unique=True, allow_unicode=True)

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.title)
        return super().save(*args, **kwargs)

    def __str__(self):
        return self.title

admin.py

from django.contrib import admin
from .models import Post


class PostAdmin(admin.ModelAdmin):
    prepopulated_fields = 'slug': ('title',)

admin.site.register(Post, PostAdmin)

urls.py

from django.urls import path
from . import views

    app_name = 'blog'
    urlpatterns = [
        path('', views.BlogList.as_view(
            template_name=app_name + "/blog_list.html"), name='blog_list'),
        path('<slug:slug>/', views.BlogDetail.as_view(
            template_name=app_name + "/blog_detail.html"), name='blog_detail'),
    ]

views.py

from .models import Post
from django.views.generic import ListView, DetailView

class BlogList(ListView):
    model = Post

class BlogDetail(DetailView):
    model = Post

blog_list.html(针对每篇文章)

<a href="% url 'blog:blog_detail' post.slug %"> post.title </a>

blog_detail.html(短)

<h1> post.title </h1>

【问题讨论】:

传递给 URL 解析器的 slug 值为空,这就是您在错误中看到 arguments '('',)' 的原因。这表明已将空字符串作为参数传递。您需要进一步调试它以确定为什么您的保存方法中没有设置任何值。 感谢您的回复。我明白为什么我会出错。问题是如何解决它。 .我在管理面板中看到 slug 字段中没有 slug。因为我有 'null=False' Django 给了我错误。是否可以在 Django 中看到某种日志?我所拥有的都在上面发布,这对于找出问题的正确原因并不是很有帮助 【参考方案1】:

我找到了解决办法!

感谢 KenWhitesell https://forum.djangoproject.com/t/django-slugify-error/6153/4 和 Evgeny https://***.com/a/4036665/15109119

也可以使用 javascript,例如,用于在 Django 管理面板中自动填充 slug 字段。它需要使用 'allow_unicode=True' 而实际上 'slugifying' 字段。

def save(self, *args, **kwargs):
    if not self.slug:
        self.slug = slugify(self.title, allow_unicode=True)
    return super().save(*args, **kwargs)

【讨论】:

以上是关于姜戈。非 ascii 字段不会创建 slug。我希望得到音译,但得到一个空字段和错误的主要内容,如果未能解决你的问题,请参考以下文章

姜戈。如何在布尔表单字段上应用 css 样式?

将非 ASCII 字符(变音符号、重音符号...)转换为最接近的 ASCII 等效字符(创建 slug)

django 1.9 slug 字段不适用于外语

姜戈 1.5。用户配置文件创建

模型验证。不想重复自己。姜戈

姜戈。数据库查询:一个字段不同