Djangocms中的自定义视图?

4

我还没有找到一个令人满意的方法来实现这个:我有一个运作良好的djangocms设置。但是我需要从CMS外部的表格中添加内容到我的主页,并在模板上呈现该内容。我可以做到这一点,但需要在CMS中编辑urls.py来使用我的视图,如下所示...

url(r'^', 'myapp.views.slideshow_info'),

...排除CMS的任何内容。我知道我只需要调整我的自定义视图以适应CMS的视图,但是我该如何实现呢?

目前我的应用程序视图如下所示:

from myapp.models import model1, model2

def slideshow_info(request):
    return render_to_response('index.html', {'slideshow_list' : model1.objects.all()})

非常感谢

1个回答

6
您可以将自定义应用程序实例钩到任何Django-CMS页面上。以下是如何执行此操作的文档:http://docs.django-cms.org/en/2.1.3/extending_cms/app_integration.html#app-hooks。您不需要更改基础URL模式以特定地重新路由/到您的视图。

在自定义应用程序挂钩可用之前,我会使用模板标签完成您要尝试完成的操作。

希望这能帮助到您。

跟进

好的,在最近完成的网站中,我必��钩一个名为“portfolio”的应用程序,以在Django-CMS网站的主页上显示图像。

以下是代码的相关部分:

#portfolio/cms_app.py
from django.utils.translation import ugettext_lazy as _

from cms.app_base import CMSApp
from cms.apphook_pool import apphook_pool

class PortfolioAppHook(CMSApp):
    name = _('Portfolio')
    urls = ['portfolio.urls']

apphook_pool.register(PortfolioAppHook)


#portfolio/urls.py
from django.conf.urls.defaults import *

urlpatterns = patterns('portfolio.views',
    url(r'^(?P<slug>[-\w]+)/$', 'project_detail', name='project_detail'),
    url(r'^$', 'portfolio_index', name='portfolio_index'),
)

#portfolio/views.py
from django.http import HttpResponseRedirect
from django.contrib.auth.decorators import login_required
from django.shortcuts import get_object_or_404, render

from portfolio.models import Project


def portfolio_index(request):
    project_objects = Project.for_public if request.user.is_anonymous() \
        else Project.objects
    projects = project_objects.all().select_related(depth=1)
    return render('portfolio/index.html',
        {'projects' : projects}, request)


def project_detail(request, slug):
    project = get_object_or_404(Project, slug=slug)
    if not project.public and request.user.is_anonymous():
        return HttpResponseRedirect('/?login=true')
    return render('portfolio/project_detail.html',
        {'project' : project}, request)

#urls.py (base urls)
from django.conf import settings
from django.conf.urls.defaults import *
from django.contrib import admin

from views import login_user, logout_user

admin.autodiscover()

urlpatterns = patterns('',
    (r'^admin/filebrowser/', include('filebrowser.urls')),
    (r'^admin/doc/', include('django.contrib.admindocs.urls')),
    (r'^admin/', include(admin.site.urls)),
    (r'^tinymce/', include('tinymce.urls')),
    url(r'^login/$', login_user, name='login_user'),
    url(r'^logout/$', logout_user, name='logout_user'),
    (r'^', include('sorl.thumbnail.urls')),
    (r'^', include('cms.urls')),
)

if settings.SERVE_STATIC_MEDIA:
    urlpatterns += patterns('',
        (r'^' + settings.MEDIA_URL.lstrip('/'), include('appmedia.urls')),
    ) + urlpatterns

从这个工作示例中可以看到,我没有改变我的基础URL来适应主页视图,而是通过cms_app.py将我的Portfolio应用程序的URL提供给了Django-CMS。

希望这能帮助您。


谢谢您的回答。这在一定程度上有所帮助,但是当我连接我的Django应用程序的urls.py时,似乎仍然存在同样的问题,它看起来像: - yuri2k
主页.urlpatterns = [url(r'^', 'myapp.views.slideshow_list'),] - yuri2k
我将在我的答案中添加一些额外的示例代码,以演示如何将自定义应用程序钩入最近完成的网站的主页。 - Brandon Taylor
谢谢Brandon的关注。我已经用稍微不同的方式解决了这个问题:一旦我注意到我的应用程序的反馈正在代替该模板上的cms反馈,并进行了一些研究,我发现我的视图中缺少上下文处理器。像这样(抱歉,我不知道如何在这些帖子中插入代码):def slideshow_info(request): return render_to_response('index.html', {'slideshow_list' : model1.objects.all()}, context_instance=RequestContext(request)). - yuri2k
很酷,很高兴你把一切都搞定了。Django-CMS有时候可能会有点难以搞定,但它为我节省了大量的时间。 - Brandon Taylor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接