【问题标题】:Post made up of blocks (text, image, video)由块组成的帖子(文本、图像、视频)
【发布时间】:2017-03-26 21:07:39
【问题描述】:

我正在尝试创建一个与在 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(用于图像和视频上传),但每条记录中的一个字段始终为空(用户只能在每个块中写入文本或上传文件),这似乎是“浪费空间”。

感谢任何解决此问题的想法。

【问题讨论】:

  • 你说得对。您将需要有多个模型用于文本帖子、图像、文件或您需要的任何其他内容。他们都应该对 Post 和 Order 字段有 FK。就像这里的例子:mitsubishi-motors.com.au/blog/… 每篇博文都是不同类型的块的组合。
  • 感谢您的保证!我看到它在 Mistsubishi 的网站上运行良好。还有一个问题 - 据我所知,我应该在 Django 中使用 Formsets 来创建和处理完成的帖子,并使用 (JS + AJAX) 添加额外的块。我在正确的轨道上吗?

标签: django django-models


【解决方案1】:

如果有人遇到类似问题,我选择了具有许多字段的通用内容块设计(根据块类型,有些是空的,例如,添加文本块时 media 是空的)。我更容易实现,然后添加必要的 JS 来动态添加更多 PostBlocks 到 Post。

相关型号:

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)

一个Post可以有任意多的PostBlocks

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-02
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    • 2019-03-22
    • 2020-05-07
    相关资源
    最近更新 更多