пользовательские представления в Djangocms?

#python #django #django-cms

#python #django #django-cms

Вопрос:

Я не нашел удовлетворительного способа сделать это: у меня есть настройка djangocms, которая работает нормально. Но мне нужно добавить содержимое из таблицы за пределами CMS на мою домашнюю страницу и отобразить это содержимое в шаблоне. Я могу это сделать, но редактирование urls.py в CMS использовать мои представления вот так…

 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:

Вы можете подключить экземпляр пользовательского приложения к любой странице Django-CMS. Вот документация о том, как это сделать: http://docs.django-cms.org/en/2.1.3/extending_cms/app_integration.html#app-hooks Вам не нужно изменять базовые шаблоны URL, чтобы специально перенаправлять / к вашему представлению.

До того, как были доступны пользовательские перехватчики приложений, я бы выполнил то, что вы пытаетесь сделать, с помощью тегов шаблонов.

Надеюсь, это вам поможет.

Продолжение

Хорошо, на недавно завершенном сайте мне пришлось подключить приложение под названием «портфолио» для отображения изображений на домашней странице сайта на 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-адреса для удобства просмотра домашней страницы, скорее я предоставил URL-адреса для моего приложения-портфолио в Django-CMS через cms_app.py

Надеюсь, это поможет вам продвинуться.

Комментарии:

1. спасибо за ваш ответ. в какой-то степени это помогает, но, похоже, у меня та же проблема, когда я подключаю urls.py моего приложения django, которое выглядит как:

2. домашняя страница.urlpatterns = [ url(r’^’, ‘myapp.views.slideshow_list’), ]

3. Я собираюсь добавить несколько дополнительных примеров кода к своему ответу, чтобы продемонстрировать, как я подключил пользовательское приложение к домашней странице недавно завершенного сайта.

4. Спасибо, Брэндон, за то, что изучил это. Я решил это немного другим способом: как только я заметил, что лента моих приложений отображается ВМЕСТО ленты cms в этом шаблоне, и немного исследовал, почему, я обнаружил, что мне не хватает контекстных процессоров в моем представлении. Вот так (я не знаю, как вставить код в эти сообщения, извините): def def slideshow_info(запрос): вернуть render_to_response(‘index.html ‘, {‘slideshow_list’ : model1.objects.all()}, context_instance=RequestContext(запрос)).

5. Круто, рад, что у вас все работает. Django-CMS может быть немного вспыльчивым, чтобы начать работать, но это сэкономило мне невероятное количество времени.