3

プロジェクトとその詳細ページを一覧表示するポートフォリオ アプリケーションがあります。通常、すべてのプロジェクトには同じ情報 (ギャラリー、概要など) がありますが、特に大規模なプロジェクトの場合、ユーザーが追加情報を追加したい場合があります。たとえば、そのページの資金調達に関する追加ページなどです。

ポートフォリオ アプリ内で上書きされたフラットページ モデルを作成して、そのアプリケーション内で作成されたフラットページが常に /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 テンプレート タグを上書きするのと少し似ています

4

2 に答える 2

3

質問の「編集2」の部分です...カスタムフラットページモデルはFlatPageから継承するため、Djangoによってそれらの間に作成された自動1対1のフィールド関係があります。

したがって、テンプレートで、渡された flatpage オブジェクトがカスタマイズされたオブジェクトの 1 つであることがわかっている場合は、次の方法で追加の属性にアクセスできます。

{{ 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)

次に、適切なMyFlatPageAdminをadmin.pyファイルに追加します(必要に応じて、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 に答える