1

Je tente d'installer mon site de manière à ce que l'URL de mon travail utilise un champ de slug au lieu d'un pk. Il me dit qu'il ne peut pas trouver mon travail avec la limace donnée (qui est un int, 147).Django Utilisation du champ Slug pour l'URL de détail

Mise à jour:

Après avoir regardé la description DetailView à https://ccbv.co.uk/projects/Django/1.11/django.views.generic.detail/DetailView/ j'ai réalisé il y a un attribut slug_field pour DetailView. Ma nouvelle vue ressemble à:

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

Question:

enter image description here

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'), 
] 

Vue:

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 
modèle

:

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}' 

manager:

class JobManager(models.Manager): 

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

Pourquoi votre champ slug est-il un int? Cela défait tout le but d'avoir une limace. Notez également que vos deux méthodes 'get_object' et' get' sont inutiles, vous devriez les supprimer. –

+0

C'est un int parce que j'utilise un ID d'autres systèmes comme ma limace. J'ai de bonnes raisons de le faire. 2) J'utilisais l'annulation de ces méthodes à un moment donné pour réaliser quelque chose et je ne faisais pas attention à ce que le dépassement ne soit pas nécessaire par la suite. Je vais les enlever. – DragonBobZ

Répondre

2

Vous n'avez pas besoin réellement de définir pk_url_kwarg du tout, et en fait en le faisant vous avez des choses confuses menant à l'objet pas trouvé.

Comme vous pouvez le voir de the default implementation of get_object, la vue recherche normalement un pk ou slug kwarg dans l'URL; celui qu'il trouve sera utilisé pour la recherche. Mais en réglant pk_url_kwarg sur slug, vous dites à l'affichage d'obtenir l'URL kwarg nommée "slug" mais l'utilise pour rechercher le champ PK, ce qui ne fonctionnera évidemment pas. Supprimez simplement cet attribut, et Django détectera votre slug kwarg et l'utilisera pour rechercher correctement le champ slug.

+0

D'accord, je vois ça maintenant sur ccbv. J'ai mis à jour ma question pour réfléchir à la façon de le faire fonctionner même s'ils utilisent un champ de limace personnalisé, ce qui est en fait ce que je veux faire. – DragonBobZ