2017-06-06 1 views
1

J'essaie d'ajouter un plan du site à un chantier que j'ai construit (la première fois en utilisant le framework sitemaps à Djnago, donc je ne suis pas sûr à 100% de ce que je devrais faire).Sitemaps Django, deux pages utilisant le même objet

Quoi qu'il en soit, j'ai deux pages, une page «Détails du travail» et une page «Application». Ceux-ci sont basés sur le modèle Job et ont des URL référençant l'ID du travail.

urls.py

url(r'^job-details/(?P<pk>\d+)/$', views.JobDetailView.as_view(), name='job_detail') , 
url(r'apply/(?P<pk>\d+)/$', views.JobApplyView.as_view(), name='job_apply' ), 

sitemap.py

class JobsSitemap(Sitemap): 
    changefreq = "daily" 
    priority = 0.5 

    def items(self): 
     return Job.objects.filter(active=True, 
           venue__contacts__account_verified=True, 
           date_expires__gte=date.today()) 

    def lastmod(self, obj): 
     return obj.date_posted 

models.py

class Job(models.Model): 
    ... field definitions here .... 

    def get_absolute_url(self): 
     return reverse('job_detail', kwargs={'pk': self.id}) 

Maintenant, le problème est que je l'ai déjà indiqué get_absolute_url() sur le modèle d'emploi pour pointer vers la page de détails du travail. Donc, je ne peux pas pointer vers la page job_apply aussi bien.

J'ai essayé de le configurer selon la section "Sitemap pour les vues statiques" dans les docs, mais cela se plaint qu'il n'y ait pas de correspondance inverse pour cette URL (car elle attend l'argument kwargs).

Quelle est la manière correcte de traiter les pages basées sur le même objet?

+0

ajouter une nouvelle méthode à votre modèle appelé get_apply_url et renvoyer l'URL job_apply ou de l'utilisation {% url "job_apply" job.pk%} dans votre template –

+0

Cela n'aide pas, car je n'utilise aucun template, juste celui par défaut pour sitemaps.xml, et en regardant ça, il n'appelle pas get_absolute_url - il a passé un ensemble d'URL. get_absolute_url() est appelé par le code django, pas le mien. –

+0

Vous pouvez définir votre propre classe CustomSitemap qui hérite de sitemaps.Sitemap et remplacer la méthode d'emplacement. – snakey

Répondre

1

Il existe peut-être d'autres façons de le faire, mais celle qui est vraiment simple est de créer deux SiteMaps. Laisser l'actuel être tel qu'il est et en créer un nouveau, cette fois assurez-vous de remplacer la propriété [location][1].

Emplacement Facultatif. Soit une méthode ou un attribut.

S'il s'agit d'une méthode, il doit renvoyer le chemin absolu pour un objet donné tel que renvoyé par items().

Si c'est un attribut, sa valeur doit être une chaîne représentant un chemin absolu à utiliser pour chaque objet retourné

class JobsApplySitemap(Sitemap): 
    changefreq = "daily" 
    priority = 0.5 

    def items(self): 
     return Job.objects.filter(active=True, 
           venue__contacts__account_verified=True, 
           date_expires__gte=date.today()) 

    def location(self, obj): 
     return "/apply/{0}/".format(obj.pk) 
     # you can use reverse instead 


    def lastmod(self, obj): 
     return obj.date_posted 
+0

Je viens de le découvrir par moi-même, avant que j'aie vu votre message, mais cela ressemble à la bonne façon de le faire. –

+0

Désolé, je ne pouvais pas poster ceci quelques minutes plus tôt. – e4c5