我正在使用Django 站点地图框架
从我的数据库中检索文章列表没有问题。
class ArticleSitemap(Sitemap):
def items(self):
return articles.objects.filter(tagid=1399).order_by('-publisheddate')
我现在想接受一个查询参数来按输入的标签 id 过滤,即:
站点地图.xml?tagid=1000
我还没有在文档或堆栈中找到示例。
我正在使用Django 站点地图框架
从我的数据库中检索文章列表没有问题。
class ArticleSitemap(Sitemap):
def items(self):
return articles.objects.filter(tagid=1399).order_by('-publisheddate')
我现在想接受一个查询参数来按输入的标签 id 过滤,即:
站点地图.xml?tagid=1000
我还没有在文档或堆栈中找到示例。
无法从类中访问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
# ...
# ...
它在请求的 Get-attribute 中:
url '.../names/getNames?pattern=Helm' 产生一个请求对象,它具有 GET : <QueryDict: {'pattern': ['Helm']}>