帖子由块组成(文本,图像,视频)

时间:2017-03-26 21:07:39

标签: django django-models

我尝试创建一个类似形式的图片网站,用于添加帖子,就像在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(所有使用ForeignKey to Post模型)定义单独的模型,或者是否有更好的解决方案。

我想到了一个通用模型,用于存储TextField(用于用户编写的文本)和用于每个块类型的FileField(用于图像和视频上传),但每个记录中的一个字段始终为空(用户只能在每个块上写文本或上传文件),这似乎是浪费空间"。

我很感激解决这个问题的任何想法。

1 个答案:

答案 0 :(得分:0)

如果有人遇到类似的问题,我选择了一个包含许多字段的通用内容块设计(根据块类型,某些字段为空,例如,添加文本块时, media 为空)。我更容易实现并稍后添加必要的JS以动态地向Post添加更多PostBlock。

相关型号:

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