代码之家  ›  专栏  ›  技术社区  ›  DragonBobZ

Django使用Slug字段作为详细URL

  •  2
  • DragonBobZ  · 技术社区  · 7 年前

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

    更新:

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

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

    问题:

    enter image description here

    URL:

    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')
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   Daniel Roseman    7 年前

    实际上你不需要定义 pk_url_kwarg 事实上,通过这样做,你已经混淆了导致找不到物体的事情。

    the default implementation of get_object ,视图通常查找 pk slug URL中的kwarg;无论找到哪个,都将用于查找。但是通过设置 pk\u url\u kwarg 鼻涕虫 ,您告诉视图获取名为“slug”的URL kwarg,但是 使用它查找PK字段

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