3

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

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

编辑

我现在有点工作

所以我在我的投资组合应用程序中覆盖了 FlatPage 模型,如下所述:

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)

这使我可以将此平面页面与特定项目相关联,

然后我覆盖 save 方法,在用户保存时写入所有额外的信息(需要整理):

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)

我缩小了管理员的规模,只允许重要的东西:

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

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

在管理员中,他们只需为页面输入一个 slug,它就会通过 save() 方法自动附加,例如:/projects/project-name/flat-page-name/

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

有没有办法解决?

编辑2

考虑到这一点,最简单的方法是编写一个模板标签来找到与平面页面关联的 projectFlatPage 并从那里访问它。有点像覆盖默认的平面模板标签

4

2 回答 2

3

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

因此,在您的模板中,如果您知道传入的 flatpage 对象是您自定义的对象之一,您可以通过以下方式访问您的额外属性:

{{ flatpage.projectflatpage.project }}
于 2011-05-04T11:42:59.633 回答
2

当然。只需编写您自己的平面模型,例如:

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)

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

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

现在一切都清楚了吗?

编辑 1

正如您在文档中所读到的,每个平面页面都应该是一个项目平面页面,反之亦然。

于 2010-10-25T09:05:04.550 回答