2016-12-29 2 views
1

J'utilise le Django Sitemap FrameworkDjango Sitemap Framework. Accepter les paramètres de requête

Je n'ai aucune difficulté à récupérer une liste d'articles de ma base de données.

class ArticleSitemap(Sitemap): 
    def items(self): 
     return articles.objects.filter(tagid=1399).order_by('-publisheddate') 

Je veux maintenant accepter un paramètre de requête pour filtrer par un identifiant d'étiquette entré à savoir:

sitemap.xml tagid = 1000

Je n'ai pas encore trouver un exemple dans la documentation ou sur la pile.

+0

Avez-vous résolu ce problème? – guival

Répondre

-1

Son à Get-attribut de la demande:

l'url '? .../noms/getNames modèle = Helm' résultats dans une requête-objet qui a comme GET: < QueryDict: { 'pattern': ['Helm']} >

+1

Mon problème est que je ne peux pas accéder à l'objet de demande provenant de la classe Django Sitemap voir: https://docs.djangoproject.com/fr/1.10/ref/contrib/sitemaps/ – sidarcy

0

Il n'est pas possible d'accéder à l'objet HttpRequest de la classe Sitemap. Probablement le moyen le plus simple est de créer votre propre vue (s) pour les sitemap (s), faites ce que vous devez faire avec HttpRequest et appelez Django vue interne pour faire le rendu final de XML.

Configurez les URL de votre sitemap en tant que documents Django (https://docs.djangoproject.com/en/dev/ref/contrib/sitemaps/#initialization), mais utilisez vos propres vues.

urls.py:

from my_app.sitemap_views import custom_sitemap_index, custom_sitemap_section 

sitemaps = { 
    'foo': FooSitemap, 
    'bar': BarSitemap, 
} 

urlpatterns = [ 
    url(r"^sitemap\.xml$", custom_sitemap_index, 
     {'sitemaps': sitemaps}, name='sitemap_index'), 
    url(r"^sitemap-(?P<section>.+)\.xml$", custom_sitemap_section, 
     {'sitemaps': sitemaps}, name='sitemaps'), 
    # ... 
] 

Votre point de vue de plan du site personnalisé sont vues standard Django: vous pouvez accéder à HttpRequest, base de données, cache ...

sitemap_views.py:

import copy 

from django.contrib.sitemaps import views as django_sitemaps_views 
from django.contrib.sitemaps.views import x_robots_tag 


@x_robots_tag 
def custom_sitemap_index(request, sitemaps, template_name='sitemap_index.xml', content_type='application/xml', 
         sitemap_url_name='django.contrib.sitemaps.views.sitemap'): 
    print("You can access request here.", request) 

    return django_sitemaps_views.index(request, template_name, content_type, sitemaps, sitemap_url_name) 


@x_robots_tag 
def custom_sitemap_section(request, sitemaps, section=None, template_name='sitemap.xml', content_type='application/xml'): 
    tag_id = int(request.GET.get('tagid')) 

    # We do not want to modify global variable "sitemaps"! 
    # Otherwise sitemap instances would be shared across requests (tag_id should be dynamic). 
    sitemaps_copy = copy.deepcopy(sitemaps) 

    for section, site in sitemaps_copy.items(): 
     if callable(site): 
      sitemaps_copy[section] = site(tag_id=tag_id) 

    return django_sitemaps_views.sitemap(request, sitemaps_copy, section, template_name, content_type) 

sitemap.py:

from django.contrib.sitemaps import Sitemap 


class FooSitemap(Sitemap): 
    def __init__(self, tag_id: int): 
     self.tag_id = tag_id 
     super().__init__() 

    def items(self): 
     return articles.objects.filter(tagid=1399) \ 
      .filter(tag_id=self.tag_id) \ 
      .order_by('-publisheddate') 


class BarSitemap(Sitemap): 
    pass 
    # ... 
    # ...