1

私の仕事の詳細のURLがpkの代わりにslugフィールドを使用するようにサイトを設定しようとしています。それは、与えられたスラッグ(int、147)で私の仕事を見つけることができないことを私に伝えています。Django詳細URLにSlugフィールドを使用する

更新:

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' 

質問:

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') 
+0

なぜあなたのスラッグフィールドはintですか?それはスラグを持つという全目的を破るものです。また、 'get_object'メソッドと' get'メソッドの両方が無意味なので、それらを削除する必要があります。 –

+0

私はスラッグとして他のシステムのIDを使用しているので、intです。私はこれを行う良い理由があります。 2)私は何かを達成するために、ある時点でこれらのメソッドをオーバーライドしていましたが、後で必要でないオーバーライドに注意を払っていませんでした。私はそれらを削除します。 – DragonBobZ

答えて

2

あなたが実際にすべてのpk_url_kwargを定義する必要はありませんし、そうすることによって、実際には、あなたが発見されていないオブジェクトにつながる事を混同しています。

the default implementation of get_objectからわかるように、このビューでは通常、URLにpkまたはslug kwargのいずれかが検索されます。ルックアップに使用されるものが検索されます。しかし、pk_url_kwargslugに設定すると、「slug」というURLのkwargを取得するように表示されますが、を使用してPKフィールドを検索すると、明らかに機能しません。

Djangoはスラッグkwargを検出し、それを使ってスラッグフィールドを正しく検索します。

+0

さて、私はccbvでそれを参照してください。私は実際に私がしたいものであるカスタムスラッグフィールドを使用していても動作させる方法を反映するために質問を更新しました。 – DragonBobZ

関連する問題