Django-MPTT full path to child pages how to make?

前端 未结 4 2002
失恋的感觉
失恋的感觉 2021-02-04 18:21

I\'m start using Django-MPTT app to get a tree-based approach on my Django-site pages.

For ex. I have pages with sub pages:

Trance:

  • Vocal Trance(su
4条回答
  •  傲寒
    傲寒 (楼主)
    2021-02-04 18:47

    I assume you mean you want to do URLs like this:

    /trance/
    /trance/vocal-trance/
    /trance/hard-trace/
    /breaks/
    /breaks/atmo-breaks/
    /breaks/progressive-breaks/
    

    If so, it's probably best to store the url fragment in your model. Something like:

    from mptt.models import MPTTModel
    from django.db import models
    from django.template.defaultfilters import slugify
    
    class Page(MPTTModel):
        name = models.CharField(max_length=50)
        slug = models.CharField(max_length=50,null=True)
        url = models.CharField(max_length=255,null=True)
    
        def save(self, *args, **kwargs)
            if self.slug is None:
                # create a slug that's unique to siblings
                slug = slugify(self.name)
                self.slug = slug
                siblings = self.get_siblings()
                i = 1
                while siblings.filter(slug=self.slug).exists():
                    i += 1
                    self.slug = slug + '-%d' % i
    
                # now create a URL based on parent's url + slug
                if self.parent:
                    self.url = '%s/%s' % (self.parent.url, self.slug)
                else:
                    self.url = self.slug
            super(Page, self).save(*args, **kwargs)
    

    Then add a URL pattern:

    (r'^pages/(?P[\w\d_/-]+)/$', 'pages.views.show_page'),
    

    And in your view you can just fetch the right page:

    def show_page(request, page_url=None):
        page = get_object_or_404(Page, url=page_url)
        ...
    

提交回复
热议问题