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'])
我正在尝试在 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
.
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'])