Django-CMS: приложения с вложенными страницами
Есть ли возможность создать приложение django, где пользователь может создавать страницы и подстраницы. Например, он создает страницу SEO и подстраницу Google SEO:
- SEO
- Google SEO
- Yahoo SEO
Я не говорю о стандартных страницах Cms от Django и не о структуре меню, подобной этой, а о компоновке бэкэнда. Важно, чтобы пользователь мог создавать страницы и подстраницы в одном приложении.
Учебное пособие или дополнительная информация была бы отличной.
Спасибо
PS: я ищу под-приложения?
Как мне создать подпрограммы в Django?
Подприложения Django и структура модуля
1 ответ
Приложение ниже позволяет вам хранить простой "плоский" контент HTML в базе данных и обрабатывает управление для вас через интерфейс администратора Django.
На плоской странице можно использовать собственный шаблон или шаблон по умолчанию.
Models.py
here = lambda x: os.path.join(os.path.abspath(os.path.dirname(__file__)), x)
templates = os.listdir( here("templates/pages/") )
class Categorie(models.Model):
nom = models.CharField(max_length=250)
slug = AutoSlugField(populate_from='nom', unique=True)
parent = models.ForeignKey('self', null=True, blank=True, related_name='children', verbose_name=u"Parent category")
def get_pages(self):
pages = Page.objects.all().filter(categorie__slug=self.slug)
return pages
class Page(models.Model):
url = models.CharField(_('URL'), max_length=100, db_index=True)
title = models.CharField(_('titre'), max_length=200)
categorie = models.ForeignKey(Categorie, null=True, blank=True)
template_name = models.CharField(_('template name'),choices=[ ( str(templates[i]), str('pages/'+templates[i])) for i in range(len(templates)) ], max_length=70, blank=True,help_text=_("Example: 'pages/contact_page.html'. If this isn't provided, the system will use 'pages/default.html'."))
ordre = models.IntegerField(blank=True, null=True,default=0)
content = models.TextField(blank=True)
Urls.py
urlpatterns = patterns('django.contrib.yourappname.views',
(r'^(?P<url>.*)$', 'page'),
)
views.py
def page(request, url):
if not url.endswith('/') and settings.APPEND_SLASH:
return HttpResponseRedirect("%s/" % request.path)
if not url.startswith('/'):
url = "/" + url
f = get_object_or_404(Page, url__exact=url)
return render_page(request, f)
@csrf_protect
def render_page(request, f):
if f.registration_required and not request.user.is_authenticated():
return redirect_to_login(request.path)
if f.template_name:
t = loader.select_template((f.get_template_name_display(), f.template_name))
else:
t = loader.get_template(DEFAULT_TEMPLATE)
f.title = mark_safe(f.title)
f.content = mark_safe(f.content)
c = RequestContext(request, {
'page': f
})
response = HttpResponse(t.render(c))
populate_xheaders(request, response, Page, f.id)
return response
Теперь вы можете использовать свой тег для отображения страниц в структуре меню на основе категорий
@register.inclusion_tag('pages/tags/menu.html')
def get_pagestatiques_structured(cat=None, template_name='pages/tags/menu.html'):
category = Categorie.objects.all().get(slug=cat)
subcategories = Categorie.objects.all().filter(parent=category.id)
return locals()
PS: это приложение основано на плоском приложении