我有一个列出项目及其详细信息页面的项目组合应用程序。每个项目通常都具有相同的信息(图库,关于等),但有时用户可能想要为特别大的项目添加额外信息,例如可能是关于该页面资金的额外页面。
是否有可能在我的投资组合应用程序中创建一个覆盖的flatpages模型,该模型强制在该应用程序中创建的任何flatpages始终以/ portfolio / project-name / flat-page开头。然后,我可以简单地将链接传递给与项目关联的那些flatpages到模板,这样用户生成的任何flatpage都将自动链接到项目页面。
修改
我现在有点工作
所以我按照描述在我的投资组合应用程序中覆盖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}}访问正常的平面信息,因为我无法访问继承模型的额外字段(即项目字段)
到底有没有?
EDIT2
考虑到这一点,最简单的方法是编写一个模板标签来查找与平面页面相关联的projectFlatPage,并从那里访问它。有点像覆盖默认的flatpages模板标签
答案 0 :(得分:3)
问题的“编辑2”部分...由于您的自定义平面模型继承自FlatPage,因此Django之间会创建一个自动的一对一字段关系。
因此,在您的模板中,如果您知道传入的flatpage对象是您自定义的对象之一,则可以通过以下方式访问您的额外属性:
{{ flatpage.projectflatpage.project }}
答案 1 :(得分: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-model,但覆盖了urls-field。现在添加一个信号,它将前缀和自动生成的url后缀连接到url(如对象id)。您现在可以添加自定义平面页面,如
flatpage = MyFlatPage(prefix='/portfolio/my-super-project/')
现在一切都清楚了吗?
编辑1
正如您可以阅读in the documentation,每个网页都应该是一个projectflatpage,反之亦然。