2010-10-25 121 views
2

我有一个列出项目及其详细页面的项目组合应用程序。每个项目通常都有相同的信息(画廊,关于等),但有时用户可能想要为特别大的项目添加额外信息,例如可能是关于该页面资金的额外页面。为特定应用程序扩展flatpages

是否有可能在我的投资组合应用程序中创建一个覆盖的页面模型,该模型会强制在该应用程序中创建的任何页面始终以/ portfolio/project-name/flat-page开头。然后,我可以简单地将链接传递给与项目相关联的页面,以便用户生成的任何简单页面将自动链接到项目页面。

编辑

我把它稍微现在的工作

所以我覆盖描述在我的投资组合应用程序中的简单页面模式:

from django.contrib.flatpages.models import FlatPage 
from project import Project 
from django.db import models 
from django.contrib.sites.models import Site 

class ProjectFlatPage(FlatPage): 
    prefix = models.CharField(max_length=100) 
    project = models.ForeignKey(Project) 

,让我这个简单页面有关联特定的项目,

然后我覆盖保存方法写所有额外的(需要进行一些清理),当用户保存的形成:

def save(self, force_insert=False, force_update=False): 
    self.url = u"%s%s/" % (self.project.get_absolute_url(),self.prefix) 
    self.enable_comments = False 
    self.registration_required = False 
    self.template_name = 'project/project_flatpage.html' 
super(FlatPage, self).save(force_insert, force_update) 

我scaleback管理员只允许重要的东西:

class ProjectFlatPageForm(forms.ModelForm): 
    prefix = forms.RegexField(label=_("Prefix"), max_length=100, regex=r'^[a-z0-9-]+$'), 

    class Meta: 
     model = ProjectFlatPage 

class ProjectnFlatPageAdmin(admin.ModelAdmin): 
    form = ProjectFlatPageForm 

所以现在用户可以添加一个单位内页我应用程序并将其与特定项目相关联。

在管理,他们只是进入蛞蝓的页面,它会自动被通过save()方法类似附加:/项目/项目名称/平页名/

剩下的问题是在模板结束。我可以通过给定的模板标签{{flatpage.title}}和{{flatpage.content}}来访问普通的flatpage信息,我无法访问继承模型的额外字段(即项目字段)

有没有办法解决?

EDIT2

已经想过这个问题,最简单的方法是写一个模板标签找到与简单页面相关联的projectFlatPage并从那里访问它。有点像覆盖默认的页面模板标签

回答

1

当然。只写你自己的简单页面的模式,例如

from django.contrib.flatpages.models import FlatPage 

class MyFlatPage(FlatPage): 
    prefix = models.CharField(max_length=100, editable=False 
    url = models.CharField(_('URL'), max_length=100, db_index=True, editable=False) 

再加入适当的MyFlatPageAdmin您admin.py文件(如果你愿意,你可以从django.contrib.flatpages.admin导入flatpageadmin和继承它)。毕竟,你使用的是flatpage模型,但覆盖了urls-field。现在添加一个信号,将前缀和自动生成的url后缀连接到url(如对象ID)。您现在可以添加自定义页面,如

flatpage = MyFlatPage(prefix='/portfolio/my-super-project/') 

现在一切都清楚了吗?

编辑1

,你可以阅读in the documentation,每一个简单页面应该是一个projectflatpage,反之亦然。

3

重新编辑您的问题的'编辑2'部分...因为您的自定义flatpage模型从FlatPage继承,所以Django在它们之间创建了自动的一对一字段关系。

所以在你的模板,如果你知道,在传递的简单页面对象是您的自定义者之一,你可以通过访问您的附加属性:

{{ flatpage.projectflatpage.project }} 
相关问题