我正在使用https://docs.djangoproject.com/en/dev/ref/contrib/sitemaps/?from=olddocs。
我有一个从api.mydomain.me为该域生成的站点地图:mydomain.com。
我可以使用django指定基本网址吗?
现在使用location()方法返回:
api.mydomain.me/page/3123 代替 mydomain.com/page/3123
这可能吗? 感谢。
答案 0 :(得分:10)
解决了,我重新定义了自己的get_urls。 它有效:
class MySitemap(Sitemap):
changefreq = "never"
priority = 0.5
location = ""
def get_urls(self, site=None, **kwargs):
site = Site(domain='mydomain.com', name='mydomain.com')
return super(MySitemap, self).get_urls(site=site, **kwargs)
def items(self):
return MyObj.objects.all().order_by('pk')[:1000]
def lastmod(self, obj):
return obj.timestamp
答案 1 :(得分:0)
你可以尝试这样的事情:
from django.contrib.sites.models import Site, SiteManager
def get_fake_site(self):
return Site(domain='mydomain.com', name='mydomain.com')
SiteManager.add_to_class('get_current', get_fake_site)
您应该在构建站点地图之前执行此操作,并在之后恢复为默认值。
答案 2 :(得分:0)
如果你有多个Sitemaps类,你可以使用mixin方法。
Django 1.5.1的一个例子。
from django.contrib.sitemaps import Sitemap
from django.contrib.sites.models import Site
from django.core.urlresolvers import reverse
from yourapp.models import MyObj
class SiteMapDomainMixin(Sitemap):
def get_urls(self, page=1, site=None, protocol=None):
# give a check in https://github.com/django/django/blob/1.5.1/django/contrib/sitemaps/__init__.py
# There's also a "protocol" argument.
fake_site = Site(domain='mydomain.com', name='mydomain.com')
return super(SiteMapDomainMixin, self).get_urls(page, fake_site, protocol=None)
class MySitemap(SiteMapDomainMixin):
changefreq = "never"
priority = 0.5
def items(self):
return MyObj.objects.all().order_by('pk')[:1000]
def location(self, item):
return reverse('url_for_access_myobj', args=(item.slug,))
def lastmod(self, obj):
return obj.updated_at
class AnotherSitemap(Sitemap):
changefreq = "never"
priority = 0.5
def items(self):
return ['url_1', 'url_2', 'url_3',]
def location(self, item):
return reverse(item)
urls.py就像......
from sitemaps import MySitemap
from sitemaps import AnotherSitemap
from yourapp.views import SomeDetailMyObjView
admin.autodiscover()
sitemaps = {
'mysitemap': MySitemap,
'anothersitemap': AnotherSitemap,
}
urlpatterns = patterns('',
# other urls...
url(r'^accessing-myobj/(?P<myobj_slug>[-\w]+)$', SomeDetailMyObjView, name='url_for_access_myobj'),
(r'^sitemap\.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps}),
)
答案 3 :(得分:0)
通过使用以前的答案,我不知道如何在代码中使用Site
,所以我使用了以下代码:
class Site:
domain = 'my_site.com'
class MySitemap(Sitemap):
def get_urls(self, site=None, **kwargs):
site = Site()
return super(MySitemap, self).get_urls(site=site, **kwargs)
答案 4 :(得分:0)
我通过创建自定义模板标记来使用补丁,并使用该函数替换 url: https://www.fraydit.com/blogs/wagtail-sitemap-in-docker/