Django-CMS apphooks菜单和反向

时间:2015-12-18 16:37:38

标签: python django python-2.7 django-cms

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

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

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

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

my 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"),
)

my 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 个答案:

答案 0 :(得分: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'])

答案 1 :(得分: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})

其中&#34;画廊&#34;是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方法。你可以从中访问slu     self.kwargs。

  
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'])