2009-09-08 5 views
4

je suit relation modèles:Django Plan du site Index exemple

class Section(models.Model): 
    section = models.CharField(max_length=200, unique=True) 
    name = models.CharField(max_length=200, blank = True) 


class Article (models.Model): 
    url = models.CharField(max_length = 30, unique=True) 
    is_published = models.BooleanField() 
    section = models.ForeignKey(Section) 

Je dois créer un plan du site pour des articles qui contient des fichiers Sitemap pour sections. Je lisais la documentation de django à ce sujet ici http://docs.djangoproject.com/en/dev/ref/contrib/sitemaps/

mais n'a pas réussi à trouver répondre comment puis-je:

  1. Définir la classe plan du site dans ce cas
  2. Comment puis-je passer des paramètres de la section dans le fichier url (comme il est expliqué dans la docs)
  3. où puis-je obtenir { « sitemaps »: sitemaps} si je définissais plan du site en tant que classe python dans un autre fichier dans l'application
+0

Votre question n'est pas du tout clair. 1. Définissez-le comme décrit dans les docs. De quoi n'es-tu pas certain? 2. Quels paramètres? Quel fichier url - voulez-vous dire urls.py? Cela n'a rien à voir avec un sitemap. 3. Vous l'importez, comme vous le feriez avec tout autre code que vous définissez dans un fichier différent. –

+0

Mais, pour créer un sitemap de section, j'ai besoin d'implémenter le filtre. Quelque chose comme ceci: Acrticle.objects.filter (section = Section.objects.get (section = section)) Je ne sais pas où devrais-je implémenter le filtre –

Répondre

5

Si je comprends bien, vous voulez utiliser l'index de sitemap qui pointe vers des fichiers XML sitemap distincts pour chaque section.

Django prend en charge cette fonctionnalité par providing a separate sitemap view pour les sitemaps d'index.

N'avez pas utilisé cette fonctionnalité auparavant, mais quelque chose comme ce qui suit fonctionnerait probablement dans votre cas.

### sitemaps.py 
from django.contrib.sitemaps import GenericSitemap 
from models import Section 

all_sitemaps = {} 
for section in Section.objects.all(): 

    info_dict = { 
     'queryset': section.article_set.filter(is_published=True), 
    } 

    sitemap = GenericSitemap(info_dict,priority=0.6) 

    # dict key is provided as 'section' in sitemap index view 
    all_sitemaps[section.name] = sitemap 

### urls.py 
from sitemaps import all_sitemaps as sitemaps 

... 
... 
... 

urlpatterns += patterns('', 
     (r'^sitemap.xml$', 'django.contrib.sitemaps.views.index', {'sitemaps': sitemaps}), 
     (r'^sitemap-(?P<section>.+)\.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps}), 
) 
0

Pour moi, la réponse acceptée avait une incidence sur la vitesse du cycle de développement et de test car il a fait python manage.py exécuter des commandes plus lentement - j'avais un peu plus à faire dans la base de données que cet exemple.

Voici les modifications que j'ai apportées pour atténuer (adapté à l'exemple). Avoir encore à la bataille le tester mais cela semble faire l'affaire (Python3):

### sitemaps.py 

class SitemapLookup(): 
    """ 
    Instantiated class replaces the dictionary of {'sitemap-section': Sitemap} for urls.py 
    Speeds up application load time by only querying the DB when a sitemap is first requested. 
    """ 

    def __init__(self): 
     self.sitemaps = {} 

    def __iter__(self): 
     self._generate_sitemaps_dict() 
     return self.sitemaps.__iter__() 

    def __getitem__(self, key): 
     self._generate_sitemaps_dict() 
     return self.sitemaps[key] 

    def items(self): 
     self._generate_sitemaps_dict() 
     return self.sitemaps.items() 

    def _generate_sitemaps_dict(self): 
     if self.sitemaps: 
      return 
     for section in Section.objects.all(): 
      info_dict = { 
       'queryset': section.article_set.filter(is_published=True), 
      } 
      # dict key is provided as 'section' in sitemap index view 
      self.sitemaps[section.name] = GenericSitemap(info_dict, priority=0.6) 



### urls.py 
from sitemaps import SitemapLookup 

... 
... 
... 

sitemaps = SitemapLookup() 

urlpatterns += patterns('', 
     (r'^sitemap.xml$', 'django.contrib.sitemaps.views.index', {'sitemaps': sitemaps}), 
     (r'^sitemap-(?P<section>.+)\.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps}), 
) 
Questions connexes