Django-CMS apphooks 菜单和反向

Django-CMS apphooks menu and reverse

我正在尝试在 django cms 中实现图库应用程序。

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

我的解决方案没有完全奏效。如果我转到此 url http://127.0.0.1:8000/en/gallery/1001/test/,其中“1001”是类别,"test" 是画廊名称,我想检查类别是否存在以及画廊是否属于该类别。

下一个问题是,如果我想用 get_absolute_url() 方法获得完整的 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])

您希望 get_absolute_url 方法匹配此 url 模式,

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

因此您需要提供两个参数,父 slug 和画廊的 slug:

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

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

访问 slug
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'])

最后我在这个 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" 是 app_name 在 cms_apps.py 中:

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)

然后我想检查一个类别是否存在以及画廊是否属于这个类别。

According to Alasdair answer:

To fetch the correct object in your GalleryDetailView, you need to override the get_object method. You can access the slugs from 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'])