【问题标题】:Django-CMS: Apps with nested pagesDjango-CMS:具有嵌套页面的应用程序
【发布时间】:2013-10-22 10:52:36
【问题描述】:

是否有可能创建一个用户可以创建页面和子页面的 django 应用程序。例如。他创建了一个页面 SEO 和一个子页面 Google SEO:

  • 搜索引擎优化
    • 谷歌搜索引擎优化
    • 雅虎搜索引擎优化

我不是在谈论来自 Django 的默认 cms 页面,也不是在谈论这样的菜单结构,而是在谈论后端的布局。用户可以在一个应用程序中创建页面和子页面,这一点很重要。

教程或其他信息会很棒。

谢谢

PS:我在寻找子应用程序吗?

How do I create sub-applications in Django?
Django sub-applications & module structure

【问题讨论】:

    标签: python django django-cms django-apps


    【解决方案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
    

    现在您可以使用 a 标签根据类别在菜单结构中显示页面

    @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()
    

    P.S:这个应用是基于flatpage app

    【讨论】:

    • 谢谢,但我收到了NameError: name 'templates' is not defined
    • 对不起here = lambda x: os.path.join(os.path.abspath(os.path.dirname(__file__)), x) templates = os.listdir( here("templates/pages/") )
    • 是的,它有效,非常感谢。但我还有一个问题:Categorie 字段为空。这些类别来自哪里?
    • 正常,你可以用也可以不用,这可能是你页面结构的一种方式。
    • 我安装了 django 类别并创建了 2 个类别,但它们不在我的应用程序的下拉列表中。你能帮我解决这个问题吗
    猜你喜欢
    • 1970-01-01
    • 2012-08-11
    • 2013-11-06
    • 2011-10-07
    • 2013-04-03
    • 2014-08-04
    • 1970-01-01
    • 2013-06-04
    相关资源
    最近更新 更多