我正在django中编写博客引擎,主要是作为一项教育练习,我想知道如何实现多部分博客文章/系列。
我在python3 / django工作,所以我的代码将是这样,尽管我主要关心的是正确实现数据库结构。鉴于这种通用模型:
class Article(models.Model):
title = models.Charfield(255)
content = models.TextField()
我的第一个想法是简单地添加一个系列表并将其链接到文章:
class Article(models.Model):
title = models.Charfield(255)
content = models.TextField()
series = models.ForeignKey('Series')
class Series(models.Model):
title = models.Charfield(255)
接下来出现的问题是如何跟踪帖子的位置和系列长度(即:4个中的2个)。我考虑使用系列条目ID,或发布日期,但我不能保证这些将与帖子的顺序相同。
我可以在文章表上简单地跟踪它。然后我可以在系列对象上使用.count()作为系列长度,并直接从字段中获取文章位置:这似乎并不像它可能那么优雅:
class Article(models.Model):
title = models.Charfield(255)
content = models.TextField()
series = models.ForeignKey('Series')
part = models.PositiveIntegerField()
然后我考虑制作第三张表,其中每行都会反映一系列文章:
class Article(models.Model):
title = models.Charfield(255)
content = models.TextField()
class Series(models.Model):
title = models.Charfield(255)
class ArticleSeriesEntry(models.Model):
article = models.OneToOneField('Article', related_name='series_info')
series = models.ForeignKey('Series', related_name='entries')
part = models.PositiveIntegerField()
我最终希望能够像这样访问信息:
{% if article.series is not None %}
This post as part {{?}} in a {{?}} part series titled {{?}}
View previous post {{?}}, view next post {{}}
{% endif %}
我觉得必须有更好的方法。提前致谢
答案 0 :(得分:1)
只有两种型号的方法就足够了。第三个模型 - ArticleSeriesEntry
并没有真正起任何作用。所以,我放弃了。
关于如何获取系列中的下一篇或上一篇文章,我将在Article
模型上创建两个方法来实现这一点:
class Article(models.Model):
# ... other fields ...
part = models.PositiveIntegerField()
def prev_part(self):
try:
prev_part = Article.objects.get(series=self.series, part=self.part-1)
except Article.DoesNotExist:
prev_part = None
return prev_part
def next_part(self):
try:
next_part = Article.objects.get(series=self.series, part=self.part+1)
except Article.DoesNotExist:
next_part = None
return next_part
def get_absolute_url(self):
# this should return url for the given article
# see docs: https://docs.djangoproject.com/en/1.11/ref/models/instances/#get-absolute-url
pass
然后在模板中:
{% if article.series %}
This post is part {{ article.part }} in a {{ article.series.article_set.count }} part series titled {{ article.series.title }}
{% if article.prev_part %}
View previous post: <a href="{{ article.prev_part.get_absolute_url }}">{{ article.prev_part.title }}</a>
{% endif %}
{% if article.next_part %}
View next post: <a href="{{ article.next_part.get_absolute_url }}">{{ article.next_part.title }}</a>
{% endif %}
{% endif %}