Django-CMS apphooks 菜单和反向

Posted

技术标签:

【中文标题】Django-CMS apphooks 菜单和反向【英文标题】:Django-CMS apphooks menu and reverse 【发布时间】:2016-03-25 10:16:45 【问题描述】:

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

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

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

下一个问题是,如果我想使用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"),
)

我的模型.py:

类类别(可排序): parent = models.ForeignKey('self', blank=True, null=True) 名称 = 模型.CharField() slug = AutoSlugField(populate_from='name') def __unicode__(self): 返回 self.name def get_absolute_url(self): 返回 ”#” 类图库(可排序): 名称 = 模型.CharField() parent = models.ForeignKey(类别,空白=假,空=真) slug = AutoSlugField(populate_from='name') def __unicode__(self): 返回 self.name def get_absolute_url(self): 返回反向('gallery_detail',args=[self.pk])

【问题讨论】:

【参考方案1】:

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

我在 models.py 中修改了 get_absolute_url() 如下:

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

其中“画廊”是 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。

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

【讨论】:

【参考方案2】:

您希望您的 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'])

【讨论】:

感谢您的帮助。我不得不删除查询集并且检查现在正在工作。但是我仍然使用 get_absolute_url 方法出错 应该是queryset=None。现已修复。 get_absolute_url 给你什么错误?您如何包含画廊网址? 我正在关注本教程docs.django-cms.org/en/develop/how_to/apphooks.html,但我得到菜单 GalleryMenu:4 无法加载。请确保它的所有 url 都存在并且可以解析。Menu GalleryMenu:3 无法加载。请确保其所有网址都存在并且可以解析。 如果你使用命名空间,你需要reverse('my_namespace:gallery_detail', ...)。我对apphooks不熟悉,所以我没有任何其他建议。我会更新您的问题以提及 apphooks,并包含任何相关代码。

以上是关于Django-CMS apphooks 菜单和反向的主要内容,如果未能解决你的问题,请参考以下文章

显示相同占位符内容的 Django-CMS apphook 模板

Django CMS Apphook 不加载

djangocms与apphook对象集成filer_image

Django-cms 菜单模板标签问题

Django CMS如何为同一个apphook的2个实例使用不同的url

个人免签,微信,支付宝,银行appHOOK技术搭建步骤和自动回调