2011-06-30 13 views
0

私はPostモデルを持っています。管理パネルでは、1つのエントリだけを持ちたいと思う - ポストを追加するために1つのリンクを持つ "投稿"。管理者の投稿のリストで、私はそれらのすべてを見たいと思う。Django:models.pyを書く方法

すべての投稿にタイトル、コンテンツ、その他の基本的なフィールドがあります。

しかし:

によりポストソースに、ポストは異なるフィールドを有することができます。例えば

Sources: 

--- First 
--- Second 
--- Third 
--- ...... 

、ポスト最初のソースと必見はポールを持っている(しかし、何のカテゴリを持っていません)。第2の送信元を持つ投稿である必要があります。カテゴリブランチ#1のカテゴリに属します(しかし、ポーリングはありません)。 3番目のソースを持つ投稿には画像フィールド(カテゴリはなく、投票はありません)などがあります。

Category branch #1 

--- cb1_first 
--- cb1_second 
--- cb1_third 

Category branch #.... 

--- cb2_first 
--- cb2_second 
--- cb2_third 

ので、ポストに追加ページを私はソースを選択するよりも、タイトル、内容、その他の基本的な事柄を書きたいとによる選択の他のフィールドに表示されます(最初のソースのためには、投票は、第二のために、である - のリストカテゴリブランチ#1のカテゴリなど)。

私はベースクラスのポストを作成し、それを他のクラスで拡張すると、SQLの追加テーブルとアプリケーション管理の多くのアイテムを取得します(つまり、基本ポストの追加、ビデオポストの追加、ポストのポーリングの追加、カテゴリブランチ#2 ...)

アドバイスを求める、そのようなアプリケーションをどのように整理するか。

+0

はたぶん[DjangoのUSERADMIN](https://code.djangoproject.com/browser/django/trunk/django/contrib/auth/admin.py)はどうするかを見てみましょうユーザーを作成するときに複数の手順があります。 –

+0

私は1人の管理者しか持っていません。実際のモデルはユーザーモデルとのアソシエーションはありません。 – Friendka

+0

私は管理サイトが複数のステップ(ユーザー名/パスワード、次に他のもの)でユーザーを作成すると言っています。もしあなたが彼らのやり方を理解したら、あなたはあなたがソースを選んだところで一歩を踏み出すことができます。そして、次のステップは、どのソースが選ばれたかに基づいて決まります。 –

答えて

1

これは、私がNULL = Falseのようなものを使ってデータベースレベルで検証を行うことに強い反対の理由です。いずれのタイプの投稿でも持つことができるすべてのフィールドを持つ単一のPostモデルを作成しますが、モデルに要件(blank=True, null=True)を適用しないでください。

代わりに、管理者を扱う場合は、フォーム上の1つのフィールドまたは他のフィールドが必要であることを確認します。具体的にはModelFormsです。

特定のフィールドを1つのインスタンスで必要とされている場合は、あなたが使用していることを強制することができます

class MyModelForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(MyModelForm, self).__init__(*args, **kwargs) 

     if self.instance.source == 'first': 
      self.fields['poll'].required = True 

はその後、ソースに基づいて表示されるべき唯一の実際のフィールドを示すために、あなたがアップ作業することができますいずれかをこれはJavaScriptのビットで、実際にはModelAdmin.get_fieldsets()で管理者から明示的に除外することができます。基本的に、プロセスは、このようです:

class MyModelAdmin(admin.ModelAdmin): 
    ... 
    fieldsets = (
     (None, { 'fields': ('common_field_1', 'common_field_2', 'common_field_3',), 
    ) 
    poll_fieldsets = (
     (None, { 'fields': ('common_field_1', 'common_field_2', 'common_field_3', 'poll',), 
    ) 

    def get_fieldsets(self, request, obj=None): 
     if obj and obj.source == 'first': 
      return self.poll_fieldsets 
     else: 
      return super(MyModelAdmin, self).get_fieldsets(request=request, obj=obj) 
+1

問題1: - これは 'Post'モデルテーブルの各行に空白のフィールドをたくさん残します。問題2: 'Post'モデルで必要とされる全てのフィールドを事前に知らなければ、拡張が難しいでしょう。 – vimukthi

+0

chrisdpratt、答えがよさそうだよ!しかし、私はデータベースの空白のフィールドについて恥ずかしいです。私は選択肢がない場合、私はcertanlyそのように行くよ!しかし、そのようなアプリケーションを整理する別の機会があるかもしれませんか?私は "一般的な関係"について何かを見つけました。上記のコメントには、通常、管理者からユーザーを追加するので、「2段階で項目を追加する」というものがあります。 – Friendka

+1

一般関係はまったく別の獣です。あなたのポストサンプルを使って、それぞれのPollPost、CategoryPostなどのために作成された異なるモデルを実際に作成したとしましょう。あなたのブログモデルでは、単にPostを参照するだけではなく、各ポストタイプに外部キーを作るのではなく、それではジェネリックリレーションズが登場します。彼らはあなたに無差別にどんな種類のモデルをも保持できる1つの外部キーを持つことができます。しかし、時には彼らの使用は時には最高の唯一の方法ですが、私は彼らが頭痛であり、実際には問題に対する最良のソリューションであることはほとんどありません。 –

0

最初に投稿に必要な基本フィールド(たとえばPostモデル)を使用してモデルを作成します。次に、ソースのモデルを作成することができます - Sourceモデル。 Postモデルには、それが作成されたソースを表す外部キーが必要です。 Sourceモデルには、特定のソースの投稿の追加フィールドを格納するために、インスタンス化するモデルの名前を格納するフィールドが含まれている必要があります。その後、必要なフィールドセットごとにすべてのモデルを作成します。それぞれにPostモデルの外部キーフィールドが必要です。たとえば、外部キーがPostに設定されたPollモデルを作成できます。

このようなデータをモデリングした後、Sourceモデルを参照するだけで、投稿の作成と検索時にすべてのフィールドタイプを解決できます。

関連する問題