2012-04-30 16 views
3

私はhttps://docs.djangoproject.com/en/dev/ref/contrib/sitemaps/?from=olddocsを使用しています。Djangoサイトマップ変更ベースURL

ドメイン:mydomain.comのapi.mydomain.meから生成されたサイトマップがあります。

私はdjangoでベースURLを指定できますか?場所()メソッドの戻り値と今

api.mydomain.me/page/3123 代わり のmydomain.com/page/3123

これは可能ですか?おかげさまで

+0

あなたは 'アクティブdjango.contrib.sites'ていますか?もしあなたがそうするなら、 'sitemaps'はそこからアクティブサイトを取ります。 – ilvar

+0

はいilvarですが、サイトマップがそこからサイトを取得することは望ましくありません。 個人のベースURLを指定したいと考えています。 返されます:api.mydomain.me/page/3232(api.mydomains.meアクティブサイト)、それは私が欲しいです:mydomain.com/page/3213 理解していますか? – beddamadre

+1

はい。あなたは 'サイト'をモンキーパッチして、必要な 'ドメイン'を持つ偽のサイトを返すようにすることができます。 – ilvar

答えて

9

解決済み、私は自分の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

素晴らしい作品です。あなたが使用しているDjangoのバージョンはわかりませんが、Django 1.5.1を使用している場合、get_urls関数に "protocol"引数を追加した場合にのみ動作します。 https://github.com/django/django/blob/1.5.1/django/contrib/sitemaps/__init__.py –

+0

@deddamadre:私は試しましたが、問題が発生しました。「get_urls()に予期しないキーワード引数がありました。あなたは同じのために助けてください?ありがとうございました。 –

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) 

あなたはあんたのサイトマップを作成する前にそれを行う、それの後に戻ってデフォルトに戻す必要があります。

+0

小さな問題: オブジェクト 'SiteManager'には属性 'add_to_class'がありません – beddamadre

+0

これはモデル専用です。とにかく、あなたのソリューションははるかに適切です。 – ilvar

0

をそして、あなたは倍数のサイトマップクラスを持っている場合は、ミックスインのアプローチを使用することができます。 それは動作します。

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}), 
)