难以将 slug 添加到 Django 中的通用详细信息视图

Posted

技术标签:

【中文标题】难以将 slug 添加到 Django 中的通用详细信息视图【英文标题】:Difficulty adding slug to Generic Detail View in Django 【发布时间】:2020-10-04 10:13:01 【问题描述】:

该视图仅适用于 PK,但是,问题是我在实时站点上的 PK 是一个不连贯的字符串,我想让一篇文章的标题连贯以提高 SEO。我不想把PK改成蛞蝓。我两个都想要。

当我尝试同时添加 PK 和 slug 时,它失败了,我得到了错误:没有反向匹配。

网址路径:

 path('idea/<slug:slug>,<int:pk>', views.IdeaDetailView.as_view(), name='detail')

型号:

class Idea(models.Model):
    idea_id = models.UUIDField(primary_key=True, default=uuid.uuid4, help_text='Searches ID')
    idea_number = models.IntegerField(blank=True, null=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
    idea_title = models.CharField(max_length=300, blank=True, null=True)
    idea_text = NonStrippingTextField(max_length=10000, blank=True, null=True)

Views.py:

class IdeaDetailView(generic.DetailView):
    model = Idea
    template_name = "idea/detail.html"

    def get_context_data(self, **kwargs):
        context = super(IdeaDetailView, self).get_context_data(**kwargs)
        context['results'] = Idea.objects.filter(idea_id=self.kwargs.get('pk'))
        return context

Admin.py:

class IdeaAdmin(admin.ModelAdmin):
       prepopulated_fields = "slug": ("idea_title",)

我想添加一个 slug,即 idea_title,但是如果我尝试将它添加到 URL 中,它会失败。

【问题讨论】:

【参考方案1】:

尝试将 slugfield、get_absolute_url 方法和 save 方法添加到您的 Idea 模型中,如下所示:

from django.conf import settings
from django.db import models
from django.urls import reverse
from django.utils.text import slugify

class Idea(models.Model):
        idea_id = models.UUIDField(primary_key=True, default=uuid.uuid4, help_text='Searches ID')
        idea_number = models.IntegerField(blank=True, null=True)
        user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
        idea_title = models.CharField(max_length=300, blank=True, null=True)
        idea_text = NonStrippingTextField(max_length=10000, blank=True, null=True)
        slug = models.SlugField(
            default='',
            editable=False,
            max_length=300,
        )

        def get_absolute_url(self):
            kwargs = 
                'pk': self.id,
                'slug': self.slug
            
            return reverse('idea-pk-slug-detail', kwargs=kwargs)

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

然后,在 urls.py 中:

path('idea/<int:pk>-<str:slug>/', views.IdeaDetailView.as_view(), name='detail')

并且,在模板名称下的views.py中:

query_pk_and_slug = True

找到了另外两个方法和更多信息HERE。

希望这会有所帮助!

【讨论】:

这是一个很好的答案,由于某种原因它仍然无法正常工作,因为模型找不到 pk。

以上是关于难以将 slug 添加到 Django 中的通用详细信息视图的主要内容,如果未能解决你的问题,请参考以下文章

带有更新的 slug 的 Django 通用视图 UpdateView 重定向 URL

Django:两个模型中的一个 url 搜索(cbv)

django中的Slug字段错误

如何将模板视图和slug定义添加到一个视图中?

无法将关键字 u'slug' 解析为 Django 中的字段错误?

django通用视图Generic detail view PublisherList must be called with either an object pk or a slug