Django 使用 Slug 字段获取详细信息 URL
Django Using Slug Field for Detail URL
我正在尝试设置我的站点,以便 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'
问题:
urls:
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')
实际上您根本不需要定义 pk_url_kwarg
,事实上这样做会使事情变得混乱,导致找不到对象。
正如您从 the default implementation of get_object
中看到的那样,视图通常会在 URL 中查找 pk
或 slug
kwarg;它找到的任何一个都将用于查找。但是通过将 pk_url_kwarg
设置为 slug
,您告诉视图获取名为 "slug" 的 URL kwarg,但 使用它来查找 PK field,这显然是行不通的。
只需完全删除该属性,Django 就会检测到您的 slug kwarg 并使用它来正确查找 slug 字段。
我正在尝试设置我的站点,以便 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'
问题:
urls:
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')
实际上您根本不需要定义 pk_url_kwarg
,事实上这样做会使事情变得混乱,导致找不到对象。
正如您从 the default implementation of get_object
中看到的那样,视图通常会在 URL 中查找 pk
或 slug
kwarg;它找到的任何一个都将用于查找。但是通过将 pk_url_kwarg
设置为 slug
,您告诉视图获取名为 "slug" 的 URL kwarg,但 使用它来查找 PK field,这显然是行不通的。
只需完全删除该属性,Django 就会检测到您的 slug kwarg 并使用它来正确查找 slug 字段。