将图像字段添加到Django中的XML站点地图

时间:2012-04-28 13:01:18

标签: django sitemap django-sitemaps

Google会识别XML站点地图(http://support.google.com/webmasters/bin/answer.py?hl=en&answer=178636)的<image>标记,并且我想在我的站点地图中添加图片属性。

因此,需要这样的东西来获取cover_image,然后加载到xml文件中:

for article in articles:
        print article.cover_image

我还需要为article.title标记加载<image:title>

我用谷歌搜索和搜索Stack Overflow作为一个例子,但我出乎意料地找不到任何,所以帮助赞赏。

到目前为止我的文件:

## sitemaps.py ##
from django.contrib.sitemaps import Sitemap
from myproject.article.models import Article

class ArticleSitemap(Sitemap):
    priority = 1.0

    def items(self):
        return  Article.objects.order_by('-id').order_by('-pub_date')

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

## urls.py ##
from myproject.sitemaps import ArticleSitemap

sitemaps = {
    "article": ArticleSitemap
}
urlpatterns += patterns ('',
    (r'^sitemap.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps})

2 个答案:

答案 0 :(得分:4)

可以通过

完成
  1. 在继承的类中重新定义get_urls方法(添加图像信息)
  2. 将默认模板更改为渲染图像信息所需的模板
  3. 这是代码:

    1. 在您的类中添加这些方法 - 这些方法与django的站点地图框架中定义的方法几乎相同,但不同于它准备需要在模板中呈现的数据的方式

      class MySItemapClass(Sitemap):
        def item():
           .........        
      
        def __get(self, name, obj, default=None):
          try:
            attr = getattr(self, name)
          except AttributeError:
            return default
          if callable(attr):
            return attr(obj)
          return attr
      
        def get_urls(self, page=1, site=None, protocol=None):
          # Determine protocol
          if self.protocol is not None:
            protocol = self.protocol
          if protocol is None:
            protocol = 'http'
      
          # Determine domain
          if site is None:
            if Site._meta.installed:
                try:
                    site = Site.objects.get_current()
                except Site.DoesNotExist:
                    pass
            if site is None:
                raise ImproperlyConfigured("To use sitemaps, either enable the sites framework or pass a Site/RequestSite object in your view.")
          domain = site.domain
      
          urls = []
          for item in self.paginator.page(page).object_list:
            loc = "%s://%s%s" % (protocol, domain, self.__get('location', item))
            priority = self.__get('priority', item, None)
            url_info = {
                'item':       item,
                'location':   loc,
                'lastmod':    self.__get('lastmod', item, None),
                'changefreq': self.__get('changefreq', item, None),
                'priority':   str(priority is not None and priority or ''),
                'images'   :   get_image(protocol, domain,item), # changed here
            }
            urls.append(url_info)
          return urls
      
    2. 根据您的需要定义get_image method

      1. 定义您的自定义模板。 我看起来像这样 - 注意定义命名空间(“urlset”)

        的变化
        <?xml version="1.0" encoding="UTF-8"?>
        <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
          xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">
        {% spaceless %}
        {% for url in urlset %}
          <url>
            <loc>{{ url.location }}</loc>
            {% if url.images %}
                {% for image in url.images %}
                    <image:image>
                        <image:loc>{{image}}</image:loc>
                    </image:image>
                {% endfor %}
            {% endif %}
            {% if url.lastmod %}<lastmod>{{ url.lastmod|date:"Y-m-d" }}</lastmod>{% endif %}
            {% if url.changefreq %}<changefreq>{{ url.changefreq }}</changefreq>{% endif %}
            {% if url.priority %}<priority>{{ url.priority }}</priority>{% endif %}
           </url>
        {% endfor %}
        {% endspaceless %}
        </urlset>
        
      2. 覆盖以使用新模板而非默认模板

        url(r'^sitemap-(?P<section>.+)\.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps,'template_name': 'seo/sitemap.xml'}),
        

答案 1 :(得分:0)

您可以添加一些图片before rendering the template并显示in template。我认为,最好为它单独申请(继承自django.contrib.sitemaps)。