Django 站点地图框架。接受查询参数

sid*_*rcy 2 python sitemap django django-sitemaps

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

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

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

我现在想接受一个查询参数以通过输入的标签 ID 进行过滤,即:

sitemap.xml?tagid=1000

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

ill*_*nan 5

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

按照 Django 文档的说明设置站点地图 URL(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",
    ),
    # ...
]
Run Code Online (Sandbox Code Playgroud)

您的自定义站点地图视图是标准的 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
    )
Run Code Online (Sandbox Code Playgroud)

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
    # ...
    # ...
Run Code Online (Sandbox Code Playgroud)