2

我正在使用Django 站点地图框架

从我的数据库中检索文章列表没有问题。

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

我现在想接受一个查询参数来按输入的标签 id 过滤,即:

站点地图.xml?tagid=1000

我还没有在文档或堆栈中找到示例。

4

2 回答 2

5

无法从类中访问HttpRequest对象。Sitemap可能最简单的方法是为站点地图创建自己的视图,做你需要做的事情HttpRequest并调用 Django 内部视图来完成 XML 的最终呈现。

按照 Django 文档的说明(https://docs.djangoproject.com/en/dev/ref/contrib/sitemaps/#initialization)设置您的站点地图 URL,但使用您自己的视图。

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
    # ...
    # ...
于 2017-03-26T20:54:19.807 回答
-2

它在请求的 Get-attribute 中:

url '.../names/getNames?pattern=Helm' 产生一个请求对象,它具有 GET : <QueryDict: {'pattern': ['Helm']}>

于 2016-12-29T15:52:42.917 回答