我有一个投资组合应用程序,其中列出了项目及其详细信息页面。每个项目通常都有相同的信息(画廊、关于等),但有时用户可能想要为一个特别大的项目添加额外的信息,例如可能是关于该页面的资金的额外页面。
是否可以在我的投资组合应用程序中创建一个覆盖的平面页面模型,强制在该应用程序中创建的任何平面页面始终以 /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 并从那里访问它。有点像覆盖默认的平面模板标签