Добавить поле изображения в карту сайта XML в Django

Google распознает тег <image> для карт сайта XML ( http://support.google.com/webmasters/bin/answer.py?hl=ru&answer=178636 ) , и я хотел бы включить атрибут изображения в мои карты сайта.

Итак, что-то вроде этого необходимо, чтобы получить cover_image и затем загрузить его в XML-файл:

for article in articles:
        print article.cover_image

Мне также нужно загрузить article.title для <image:title>.

Я гуглил и искал пример переполнения стека, но неожиданно не смог найти ни одного, поэтому помощь приветствуется.

Мои файлы на данный момент:

## 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})
4 голоса | спросил AAA 28 PMpSat, 28 Apr 2012 17:01:18 +040001Saturday 2012, 17:01:18

2 ответа


0

Это может быть сделано

  1. Переопределение метода get_urls в вашем унаследованном классе (добавьте информацию об изображении)
  2. Измените шаблон по умолчанию на тот, который требуется для отображения информации об изображении

вот код:

  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
    

определите 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'}),
    
ответил ashish 20 22012vEurope/Moscow11bEurope/MoscowTue, 20 Nov 2012 15:33:28 +0400 2012, 15:33:28
0

Вы можете добавить несколько изображений перед рендерингом шаблон и отобразить их в шаблоне . Я думаю, для этого лучше сделать отдельное приложение (унаследованное от django.contrib.sitemaps).

ответил ilvar 29 AMpSun, 29 Apr 2012 09:45:35 +040045Sunday 2012, 09:45:35

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132