我尝试创建一个类似形式的图片网站,用于添加帖子,就像在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(用于图像和视频上传),但每个记录中的一个字段始终为空(用户只能在每个块上写文本或上传文件),这似乎是浪费空间"。
我很感激解决这个问题的任何想法。
答案 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 。