プロジェクトとその詳細ページを一覧表示するポートフォリオ アプリケーションがあります。通常、すべてのプロジェクトには同じ情報 (ギャラリー、概要など) がありますが、特に大規模なプロジェクトの場合、ユーザーが追加情報を追加したい場合があります。たとえば、そのページの資金調達に関する追加ページなどです。
ポートフォリオ アプリ内で上書きされたフラットページ モデルを作成して、そのアプリケーション内で作成されたフラットページが常に /portfolio/project-name/flat-page で始まるようにすることは可能でしょうか。次に、プロジェクトに関連付けられたフラットページへのリンクをテンプレートに渡すだけで、ユーザーが生成したフラットページがプロジェクト ページから自動的にリンクされるようになります。
編集
私は今それがいくらか働いています
そこで、ポートフォリオ アプリの 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
これで、ユーザーはアプリ内にフラット ページを追加し、それを特定のプロジェクトに関連付けることができます。
admin では、ページのスラッグを入力するだけで、次のように save() メソッドを介して自動的に追加されます: /projects/project-name/flat-page-name/
残りの問題はテンプレート側にあります。指定されたテンプレート タグ {{ flatpage.title }} および {{ flatpage.content }} を介して通常のフラットページ情報にアクセスできます。継承されたモデルの追加フィールド (つまり、プロジェクト フィールド) にはアクセスできません。
とにかくこのあたりはありますか?
EDIT2
考えてみると、最も簡単な方法は、テンプレート タグを記述して、フラットページに関連付けられた projectFlatPage を見つけ、そこからアクセスすることです。デフォルトの flatpages テンプレート タグを上書きするのと少し似ています