2017-03-26 1 views
1

나는 Imgur에서와 같이 게시물을 추가하기 위해 비슷한 양식으로 이미지 사이트를 만들려고합니다. 게시물은 무제한으로 구성되어야합니다. 블로그 게시물을 완성하는 다양한 유형 (텍스트, 이미지, 비디오)의 블록 수입니다.포스트 (텍스트, 이미지, 비디오)로 구성된 포스트

사용자는 어떤 블록을 시작할지 (이미지를 업로드 할 수도 있음) 선택한 다음 버튼을 클릭하여 다른 블록을 추가합니다.

단일 게시물을 구성하는 블록에 적합한 모델을 알아낼 수 없습니다.

이 내 포스트 모델 :

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="") 

내가하는 TextBlock imageblock 및 videoblock에 대해 별도의 모델을 정의해야하는지 모르겠어요 (외래 키의 모든 모델을 게시하는) 또는 더 나은 솔루션이 있다면.

나는 모든 블록 유형에 사용되는 TextField (사용자가 작성한 텍스트 용)와 FileField (이미지 및 비디오 업로드 용)를 저장하는 보편적 인 모델을 생각했지만 모든 레코드의 필드 중 하나는 항상 비어있었습니다 (사용자는 텍스트를 쓰거나 블록 당 파일을 업로드 할 수 있습니다) "공간 낭비"처럼 보입니다.

이 문제를 해결하기위한 모든 아이디어에 감사드립니다.

+0

당신이 옳습니다. 텍스트 게시물, 이미지, 파일 또는 기타 필요한 여러 모델이 필요합니다. 그들 모두는 우편과 주문 필드에 FK를 가져야합니다. 예를 들면 다음과 같습니다. https://www.mitsubishi-motors.com.au/blog/8-essentials-prepare-awesome-couples-road-trip/ 각 블로그 게시물은 여러 유형의 블록을 조합 한 것입니다. –

+0

안심 감사드립니다! Mistsubishi의 사이트에서 아름답게 작동하는 것을 볼 수 있습니다. 한 가지 더 질문 - 내가 아는 한 Django에서 완성 된 게시물을 만들고 처리하기 위해 Formsets를 사용해야하고 추가 블록을 추가하기 위해 JS + AJAX를 사용해야합니다. 나는 올바른 길을 가고 있는가? – leszcz

답변

0

비슷한 문제가 발생하는 경우 많은 필드가있는 범용 콘텐츠 블록 디자인을 선택했습니다 (일부는 블록 유형에 따라 비어 있음, 예 : 미디어은 텍스트 블록을 추가 할 때 비어 있음). Post에 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) 

포스트는 당신이 필요로 PostBlocks 많은을 가질 수 있습니다.