作者:超级活死人 | 来源:互联网 | 2023-09-23 10:35
想用Django开发一个个人博客,参考了网上的一些文章和Django文档,目前做到日期归档这个功能,以下是有问题的View
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| class ArchiveView(ListView):
template_name = "blog.html"
context_object_name = "articles"
def get_queryset(self):
# 接收从url传递的year和month参数,转为int类型
year = int(self.kwargs['year'])
mOnth= int(self.kwargs['month'])
# 按照year和month过滤文章
article_list = ArticleModel.manager.filter(status='p', add_time__year=year, add_time__mOnth=month).order_by('-add_time')
for article in article_list:
pdb.set_trace()
article.cOntent= markdown2.markdown(article.content, extras=['fenced-code-blocks'], )
return article_list
def get_context_data(self, **kwargs):
return super(ArchiveView, self).get_context_data(**kwargs) |
用pdb试了很久,最后发现问题出在这一句:
1
| article_list = ArticleModel.manager.filter(status='p', add_time__year=year, add_time__mOnth=month).order_by('-add_time') |
其中
无法过滤到正确月份,导致结果的QuerySet为空;pdb调试上面这个View中的
变量和
又确实是一样的,理论上应该可以得到我想要的文章。
注:
和
都可以成功地找到符合条件的文章;也试过用Q,结果是一样的。
不知道问题描述清楚了没有= =|||,我现在也没有头绪,如果大家也不知道,那么从经验上来说,这个问题应该怎么去找解决办法……
这是我的ArticleModels,还附带了自定义的Manager,不知道会不会是因为这个影响到的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| class ArticleAchiveManage(models.Manager):
def archive(self):
date_list = ArticleModel.manager.dates('add_time', 'month', order='DESC')
# 获取到降序排列的精确到月份且已去重的文章发表时间列表
# 并把列表转为一个字典,字典的键为年份,值为该年份下对应的月份列表
date_dict = defaultdict(list)
for d in date_list:
date_dict[d.year].append(d.month)
# 模板不支持defaultdict,因此我们把它转换成一个二级列表,由于字典转换后无序,因此重新降序排序
return sorted(date_dict.items(), reverse=True)
class ArticleModel(models.Model):
STATUS_CHOICES = (
('d', '草稿'),
('p', '已发布')
)
category = models.ForeignKey('CategoryModel', verbose_name='分类', null=True)
status = models.CharField('文章状态', default='d', max_length=1, choices=STATUS_CHOICES)
manager = ArticleAchiveManage()
title = models.CharField(max_length=32, verbose_name=u'标题')
abstract = models.TextField(max_length=144, verbose_name='摘要', default='')
cOntent= models.TextField(verbose_name=u'内容')
add_time = models.DateTimeField(verbose_name=u'发表时间', auto_now_add=True)
last_modified_time = models.DateTimeField('修改时间', auto_now=True)
read_times = models.PositiveIntegerField(verbose_name=u'阅读次数', default=0)
bravo_times = models.PositiveIntegerField(verbose_name=u'点赞', default=0)
class Meta:
verbose_name = '文章'
verbose_name_plural = verbose_name
def __str__(self):
return self.title |