2016-12-29 2 views
1

Я использую Django Sitemap FrameworkDjango Sitemap Framework. Принятие параметров запроса

У меня нет проблем с получением списка статей из моей БД.

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

теперь я хочу, чтобы принять параметр запроса для фильтрации введенного идентификатор метки, а именно:?

sitemap.xml TagID = 1000

Я до сих пор найти пример в документации или на стеке.

+0

Где вы можете это решить? – guival

ответ

-1

Его в запросе, в Get-атрибута:

URL-адрес? .../имена/GetNames шаблон = Helm 'Результаты в запросе-объект, который имеет в качестве GET: < QueryDict: { 'шаблон': ['Helm']} >

+1

Моя проблема заключается в том, что я не могу получить доступ к объекту запроса, исходящему из класса Sitemap Django, см. Https://docs.djangoproject.com/en/1.10/ref/contrib/sitemaps/ – sidarcy

0

Недоступен HttpRequest объект от Sitemap класс. Вероятно, самый простой способ - создать свой собственный вид (ы) для sitemap (ы), сделать то, что вам нужно сделать с HttpRequest, и вызвать внутреннее представление Django для выполнения окончательного рендеринга XML.

Установите URL-адреса вашей карты сайта, как указано в документах Django (https://docs.djangoproject.com/en/dev/ref/contrib/sitemaps/#initialization), но используйте свои собственные представления.

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

Ваши взгляды на заказ карта сайта являются стандартные представления Django: вы можете получить доступ к HttpRequest, базы данных, кэш ...

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 
    # ... 
    # ... 
Смежные вопросы