首页 文章

Django-CMS apphooks菜单和反向

提问于
浏览
1

我试图在django cms中实现一个画廊应用程序 .

我想要这样的网址:www.site-url.com/gallery/category/gallery-name

我的解决方案并不完全正常 . 如果我转到这个网址http://127.0.0.1:8000/en/gallery/1001/test/,其中"1001"是一个类别而"test"是gallery-name,我想检查一个类别是否存在以及一个图库是否属于这个类别 .

接下来的问题是,如果我想用 get_absolute_url() 方法获取图库的完整网址 . 我的urls.py实现不好,所以它不起作用 .

我的urls.py:

from django.conf.urls import patterns, url
from .views import GalleryListView, GalleryDetailView

urlpatterns = patterns('',
    # List View
    url(r'^(?P<parent_slug>[-\w]+)/(?P<slug>[-\w]+)/$', GalleryDetailView.as_view(), name="gallery_detail"),
    url(r'^$', GalleryListView.as_view(), name="gallery_list"),
)

我的models.py:

class Category(Sortable):
    parent = models.ForeignKey('self', blank=True, null=True)

    name = models.CharField()
    slug = AutoSlugField(populate_from='name')

    def __unicode__(self):
        return self.name

    def get_absolute_url(self):
        return "#"

class Gallery(Sortable):
    name = models.CharField()

    parent = models.ForeignKey(Category, blank=False, null=True)

    slug = AutoSlugField(populate_from='name')

    def __unicode__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('gallery_detail', args=[self.pk])

2 回答

  • 2

    您希望 get_absolute_url 方法匹配此网址格式,

    url(r'^(?P<parent_slug>[-\w]+)/(?P<slug>[-\w]+)/$', GalleryDetailView.as_view(), name="gallery_detail"),
    

    所以你需要提供两个参数,父slug和gallery的slug:

    class Gallery(Sortable):
        def get_absolute_url(self):
            return reverse('gallery_detail', args=[self.parent.slug, self.slug])
    

    要在 GalleryDetailView 中获取正确的对象,您需要覆盖 get_object 方法 . 您可以从 self.kwargs 访问slu .

    GalleryDetailView(DetailView):
        ...
        def get_object(self, queryset=None):
            if queryset is None:
                queryset = self.get_queryset()
            return queryset.get(parent__slug=self.kwargs['parent_slug'], slug=self.kwargs['slug'])
    
  • 0

    最后我在这个youtube教程中找到了get_absolute_url()方法的解决方案https://www.youtube.com/watch?v=Dj8dhgmzlFM

    我修改了models.py中的get_absolute_url(),如下所示:

    def get_absolute_url(self):
       return reverse('gallery:gallery_detail', kwargs={'slug': self.slug, 'parent_slug': self.parent.slug})
    

    其中“gallery”是cms_apps.py中的app_name:

    from cms.app_base import CMSApp
    from cms.apphook_pool import apphook_pool
    from django.utils.translation import ugettext_lazy as _
    from .cms_menus import GalleryMenu
    
    
    class GalleryApp(CMSApp):
        name = _('Gallery')
        urls = ['app.apps.gallery.urls', ]
        app_name = 'gallery'
        menus = [GalleryMenu]
    
    apphook_pool.register(GalleryApp)
    

    然后我想检查是否存在类别以及图库是否属于此类别 .

    根据Alasdair的回答:要在GalleryDetailView中获取正确的对象,您需要覆盖get_object方法 . 您可以从self.kwargs访问slugs .

    GalleryDetailView(DetailView):
        ...
        def get_object(self, queryset=None):
            if queryset is None:
                queryset = self.get_queryset()
            return queryset.get(parent__slug=self.kwargs['parent_slug'], slug=self.kwargs['slug'])
    

相关问题