2

我想实现 django 站点地图,但我对将 sitemaps.py 文件放在哪里以及我应该修改哪个 urls.py 文件以包括:

url(r'^sitemap.xml$', 'django.contrib.sitemaps.views.index', {'sitemaps': sitemaps}),

我应该把上面的行放在 project(mysite) urls.py 文件还是 app(sampleapp1) urls.py 文件中?

4

2 回答 2

7

您在项目的应用程序中创建站点地图(您需要站点地图的那些),文档没有说明什么和在哪里,因为您可以随心所欲地做,您只需将它们注册在通过 url 传递的字典中. 例如,您有your_project一个blog应用程序:

your_project
  - blog
    - models.py
    - views.py
    - ...
    - sitemap.py

在您的 sitemap.py 中:

from django.contrib.sitemaps import Sitemap
from blog.models import Entry

class BlogSitemap(Sitemap):
    changefreq = "never"
    priority = 0.5

    def items(self):
        return Entry.objects.filter(is_draft=False)

    def lastmod(self, obj):
        return obj.pub_date

然后在您的 urls.py (项目的主要 urls.py )中:

...

from blog.sitemap import BlogSitemap

sitemaps = {
    'blog':BlogSitemap
}


url(r'^sitemap\.xml$', 'django.contrib.sitemaps.views.index', {'sitemaps': sitemaps}, name='django.contrib.sitemaps.views.sitemap'),

您对需要的每个站点地图重复相同的操作,如果您的项目很大(许多应用程序),则明智的做法是为每个应用程序使用不同的站点地图,然后在您的 urls.py 中:

...

from blog.sitemap import BlogSitemap
from fooapp.sitemap import FooSitemap
from barapp.sitemap import BarSitemap

sitemaps = {
    'blog':BlogSitemap,
    'foo':FooSitemap,
    'bar':BarSitemap,
}
于 2014-08-10T16:01:35.547 回答
3

文档确实强调了这一点,但这里是总结版本:

  1. 确保您有正确的设置。这归结为两件事:

    1. django.contrib.sitemapsINSTALLED_APPS
    2. 确保您定义了一个站点。过去这是默认完成的,但从 1.6 开始,它已成为可选。然而,许多 contrib 应用程序和一些第三方应用程序都依赖于此。
  2. 接下来,您必须决定将sitemap.xml. 这很重要,因为它的位置将控制站点地图中包含的内容。如果您将其指向/foo/sitemap.xml仅以开头的那些 urlfoo/将包含在站点地图中。因此,最好将其放在根 url conf中,这通常位于您的项目级别。您所要做的就是将问题中的行添加到适当的urls.py.

  3. 现在您必须实际生成站点地图。Django 提供了两种自动生成它的方法。GenericSiteMap为您的模型和FlatPageSitemap其他一切。您当然可以创建自己的自定义站点地图。

    1. 创建一个继承自的类django.contrib.sitemaps.SiteMap
    2. 在这个类中,创建一个方法items。这就是站点地图中的链接。对于您的对象,您可以只返回一个查询集。如果要创建自定义链接,则返回url 名称列表,django 会自动调用reverse()计算 URL。
    3. 导入此类名称并将其作为根中的“站点地图”字典传递urls.py。因此,如果您拥有ProductMap所有产品,那么您将{'sitemaps': {'products': ProductMap}}作为最后一个参数传递(在确保导入它之后)。

这里的所有都是它的。

于 2014-08-10T16:02:04.053 回答