2017-03-26 9 views
1

私はImgurのように投稿を追加するための類似のフォームを使用して画像サイトを作成しようとしています。投稿は、無制限ブロックの数(テキスト、画像、ビデオ)で完成し、ブログ投稿を完成させる必要があります。ブロック(テキスト、画像、ビデオ)で構成された投稿

ユーザーは、どのブロックを開始するか(画像をアップロードする可能性がある)を選択し、ボタンをクリックして別のブロックを追加します。

私は、1つの投稿を構成するブロックの分かりやすいモデルを見つけることができません。

これは私のPostモデルである:

class Post(models.Model): 
author = models.ForeignKey('auth.User') 
text = models.TextField() #just a placeholder until blocks work 
created_date = models.DateTimeField(
     default=timezone.now) 
isWaiting = models.BooleanField(default=True) 
isLocked = models.BooleanField(default=False) 
views = models.IntegerField(default=0) 
tags = TaggableManager(help_text="") 

私はテキストブロック、imageblockとvideoblockのための別のモデルを定義する必要がある場合、私は知りません(ForeignKeyの持つすべてのモデルを投稿する)、またはよりよい解決策があるかどう。

私は、すべてのブロックタイプで使用されるTextField(ユーザーが書き込んだテキスト用)とFileField(画像とビデオ用)を保存するユニバーサルモデルを考えましたが、各レコードのフィールドの1つは常に空です(ユーザーはテキストを書き込むこともブロックごとにファイルをアップロードすることもできます)、それは「スペースの無駄」のようです。

私はこの問題を解決するためのアイデアを感謝します。

+0

あなたは絶対に正しいです。あなたは、テキスト投稿、画像、ファイルまたは必要なもののためのいくつかのモデルを持つ必要があります。それらのすべては、FKをPostフィールドとOrderフィールドに付ける必要があります。ここのようにちょうど例:https://www.mitsubishi-motors.com.au/blog/8-essentials-prepare-awesome-couples-road-trip/各ブログ投稿はさまざまな種類のブロックの組み合わせです。 –

+0

安心してくれてありがとう!私はMistsubishiのサイトでそれが美しく動作するのを見ます。私が知る限り、完成した投稿の作成と処理にはDjangoでFormsetsを、ブロックを追加するにはJS + AJAXを使うべきです。正しい軌道にいるのですか? – leszcz

答えて

0

誰かが同様の問題に遭遇した場合は、多くのフィールドを持つ汎用コンテンツブロックデザインを選択しました。ブロックタイプによっては、メディアが空です。ポストにPostBlockをさらに動的に追加するために、必要なJSを実装して後で追加する方が簡単でした。

関連モデル:

class Post(models.Model): 
    author = models.ForeignKey('auth.User') 
    title = models.CharField(max_length=100) 
    slug = models.SlugField(unique=True) 
    created_date = models.DateTimeField(default=timezone.now) 
    views = models.IntegerField(default=0) 
    tags = TaggableManager(help_text="") 

class PostBlock(models.Model): 
    POST_TYPE_CHOICES = (
     ('TXT', 'Text'), 
     ('IMG', 'Image'), 
     ('VID', 'Video'), 
    ) 
    postid = models.ForeignKey('Post', on_delete=models.CASCADE) 
    text = models.TextField(max_length=1024, blank=True) 
    media = models.FileField(upload_to=content_path, blank=True, validators=[ 
          validate_file_extension]) 
    contenttype = models.CharField(
     max_length=3, 
     choices=POST_TYPE_CHOICES, 
     default='IMG', 
    ) 
    order = models.IntegerField(default=0) 

一つポストはあなたが必要とするようポストブロックとして多くを持つことができます。

関連する問題