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:
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')
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. –
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