Django 使用 Slug 字段作为详细 URL

Posted

技术标签:

【中文标题】Django 使用 Slug 字段作为详细 URL【英文标题】:Django Using Slug Field for Detail URL 【发布时间】:2018-03-30 15:37:28 【问题描述】:

我正在尝试设置我的网站,以便我的工作详细信息的 url 将使用 slug 字段而不是 pk。它告诉我它无法使用给定的 slug(它是一个 int,147)找到我的工作。

更新:

查看https://ccbv.co.uk/projects/Django/1.11/django.views.generic.detail/DetailView/ 的DetailView 描述后,我意识到DetailView 有一个slug_field 属性。我的新视图如下所示:

class JobDetailView(CacheMixin, DetailView):
    model = Job
    slug_field = 'slug'

问题:

网址:

urlpatterns = [
    url(r'^careers$', views.job_list, name='job-list'),
    url(r'^careers/(?P<slug>[0-9]+)/$', views.JobDetailView.as_view(), name='job-detail'),
]

查看:

class JobDetailView(CacheMixin, DetailView):
    model = Job
    pk_url_kwarg = 'slug'
    def get_object(self, *args, **kwargs):
        # Call the superclass
        object = super(JobDetailView, self).get_object()
        # Return the object
        return object

    def get(self, request, *args, **kwargs):
        object = super(JobDetailView, self).get(request, *args, **kwargs)
        return object

型号:

class Job(UpdateAble, PublishAble, models.Model):
    slug = models.CharField(unique=True, max_length=25)
    facility = models.ForeignKey('Facility')
    recruiter = models.ForeignKey('Recruiter')
    title = models.TextField()
    practice_description = models.TextField(blank=True, default="")
    public_description = models.TextField(blank=True, default="")

    objects = JobManager()

    def get_next(self, **kwargs):
        jobs = Job.objects.published()
        next = next_in_order(self, qs=jobs)
        if not next:
            next = jobs[0]
        return next

    def get_prev(self, **kwargs):
        jobs = Job.objects.published()
        prev = prev_in_order(self, qs=jobs)
        if not prev:
            prev = jobs[len(jobs)-1]
        return prev

    def __str__(self):
        return f'self.facility; self.title'

经理:

class JobManager(models.Manager):

    def published(self):
        return super(JobManager, self).get_queryset().filter(is_published=True).order_by('facility__name', 'title')

【问题讨论】:

为什么你的 slug 字段是 int ?这违背了拥有蛞蝓的全部目的。另请注意,您的 get_objectget 方法都是没有意义的,您应该删除它们。 这是一个 int,因为我使用来自其他系统的 ID 作为我的 slug。我有充分的理由这样做。 2)我曾一度使用覆盖这些方法来实现某些目标,但没有注意之后不需要覆盖。我会删除它们。 【参考方案1】:

您实际上根本不需要定义pk_url_kwarg,实际上这样做会混淆导致找不到对象的事情。

从the default implementation of get_object 可以看出,视图通常在 URL 中查找 pkslug kwarg;它找到的任何一个都将用于查找。但是通过将pk_url_kwarg 设置为slug,您是在告诉视图获取名为“slug”的 URL kwarg,但使用它来查找 PK 字段,这显然行不通.

只需完全删除该属性,Django 就会检测到您的 slug kwarg 并使用它来正确查找 slug 字段。

【讨论】:

好的,我现在在 ccbv 上看到了。我更新了我的问题以反映即使他们使用自定义 slug 字段如何使其工作,这实际上是我想要做的。

以上是关于Django 使用 Slug 字段作为详细 URL的主要内容,如果未能解决你的问题,请参考以下文章

Django slug 更改 URL 但没有获得详细视图

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

Slug 没有在 Django 2.0 中呈现详细信息页面

django相关字段解释(slug)

如何在 django 中的所有 url 使用 slug 之前或之后没有任何内容?

Django URL 基于带空格的字符域?