diff --git a/doc/~$软件泛读、标注和维护报告文档.docx b/doc/~$软件泛读、标注和维护报告文档.docx
deleted file mode 100644
index 21eef57..0000000
Binary files a/doc/~$软件泛读、标注和维护报告文档.docx and /dev/null differ
diff --git a/query b/query
new file mode 100644
index 0000000..0eaebf1
--- /dev/null
+++ b/query
@@ -0,0 +1 @@
+mysql
diff --git a/src/DjangoBlog/accounts/tests.py b/src/DjangoBlog/accounts/tests.py
index 6893411..a15ca49 100644
--- a/src/DjangoBlog/accounts/tests.py
+++ b/src/DjangoBlog/accounts/tests.py
@@ -48,7 +48,7 @@ class AccountTest(TestCase):
article.body = "nicecontentaaa"
article.author = user
article.category = category
- article.type = 'a'
+ article.article_type = 'a'
article.status = 'p'
article.save()
@@ -96,7 +96,7 @@ class AccountTest(TestCase):
article.body = "nicecontentttt"
article.author = user
- article.type = 'a'
+ article.article_type = 'a'
article.status = 'p'
article.save()
diff --git a/src/DjangoBlog/blog/admin.py b/src/DjangoBlog/blog/admin.py
index 46c3420..a4ee735 100644
--- a/src/DjangoBlog/blog/admin.py
+++ b/src/DjangoBlog/blog/admin.py
@@ -51,10 +51,10 @@ class ArticlelAdmin(admin.ModelAdmin):
'creation_time',
'views',
'status',
- 'type',
+ 'article_type',
'article_order')
list_display_links = ('id', 'title')
- list_filter = ('status', 'type', 'category')
+ list_filter = ('status', 'article_type', 'category')
filter_horizontal = ('tags',)
exclude = ('creation_time', 'last_modify_time')
view_on_site = True
diff --git a/src/DjangoBlog/blog/context_processors.py b/src/DjangoBlog/blog/context_processors.py
index 73e3088..5b5dbe4 100644
--- a/src/DjangoBlog/blog/context_processors.py
+++ b/src/DjangoBlog/blog/context_processors.py
@@ -27,7 +27,7 @@ def seo_processor(requests):
'ARTICLE_SUB_LENGTH': setting.article_sub_length,
'nav_category_list': Category.objects.all(),
'nav_pages': Article.objects.filter(
- type='p',
+ article_type='p',
status='p'),
'OPEN_SITE_COMMENT': setting.open_site_comment,
'BEIAN_CODE': setting.beian_code,
diff --git a/src/DjangoBlog/blog/documents.py b/src/DjangoBlog/blog/documents.py
index 0f1db7b..2d86092 100644
--- a/src/DjangoBlog/blog/documents.py
+++ b/src/DjangoBlog/blog/documents.py
@@ -197,7 +197,7 @@ class ArticleDocumentManager():
pub_time=article.pub_time,
status=article.status,
comment_status=article.comment_status,
- type=article.type,
+ type=article.article_type,
views=article.views,
article_order=article.article_order) for article in articles]
diff --git a/src/DjangoBlog/blog/migrations/0007_remove_article_type_remove_links_last_mod_time_and_more.py b/src/DjangoBlog/blog/migrations/0007_remove_article_type_remove_links_last_mod_time_and_more.py
new file mode 100644
index 0000000..7f2e8dd
--- /dev/null
+++ b/src/DjangoBlog/blog/migrations/0007_remove_article_type_remove_links_last_mod_time_and_more.py
@@ -0,0 +1,90 @@
+# Generated by Django 5.2.4 on 2025-11-23 18:24
+
+import django.db.models.deletion
+import django.utils.timezone
+from django.conf import settings
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('blog', '0006_alter_blogsettings_options'),
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ]
+
+ operations = [
+ migrations.RemoveField(
+ model_name='article',
+ name='type',
+ ),
+ migrations.RemoveField(
+ model_name='links',
+ name='last_mod_time',
+ ),
+ migrations.AddField(
+ model_name='article',
+ name='article_type',
+ field=models.CharField(choices=[('a', 'Article'), ('p', 'Page')], default='a', max_length=1, verbose_name='type'),
+ ),
+ migrations.AddField(
+ model_name='links',
+ name='last_modify_time',
+ field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='modify time'),
+ ),
+ migrations.AlterField(
+ model_name='blogsettings',
+ name='beian_code',
+ field=models.CharField(blank=True, default='', max_length=2000, verbose_name='备案号'),
+ ),
+ migrations.AlterField(
+ model_name='blogsettings',
+ name='global_footer',
+ field=models.TextField(blank=True, default='', verbose_name='公共尾部'),
+ ),
+ migrations.AlterField(
+ model_name='blogsettings',
+ name='global_header',
+ field=models.TextField(blank=True, default='', verbose_name='公共头部'),
+ ),
+ migrations.AlterField(
+ model_name='blogsettings',
+ name='gongan_beiancode',
+ field=models.TextField(blank=True, default='', max_length=2000, verbose_name='公安备案号'),
+ ),
+ migrations.AlterField(
+ model_name='blogsettings',
+ name='google_adsense_codes',
+ field=models.TextField(blank=True, default='', max_length=2000, verbose_name='adsense code'),
+ ),
+ migrations.CreateModel(
+ name='Favorite',
+ fields=[
+ ('id', models.AutoField(primary_key=True, serialize=False)),
+ ('creation_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='creation time')),
+ ('last_modify_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='modify time')),
+ ('article', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='blog.article', verbose_name='article')),
+ ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='user')),
+ ],
+ options={
+ 'verbose_name': 'favorite',
+ 'verbose_name_plural': 'favorite',
+ 'unique_together': {('user', 'article')},
+ },
+ ),
+ migrations.CreateModel(
+ name='Like',
+ fields=[
+ ('id', models.AutoField(primary_key=True, serialize=False)),
+ ('creation_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='creation time')),
+ ('last_modify_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='modify time')),
+ ('article', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='blog.article', verbose_name='article')),
+ ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='user')),
+ ],
+ options={
+ 'verbose_name': 'like',
+ 'verbose_name_plural': 'like',
+ 'unique_together': {('user', 'article')},
+ },
+ ),
+ ]
diff --git a/src/DjangoBlog/blog/migrations/0008_article_slug.py b/src/DjangoBlog/blog/migrations/0008_article_slug.py
new file mode 100644
index 0000000..8fa4b21
--- /dev/null
+++ b/src/DjangoBlog/blog/migrations/0008_article_slug.py
@@ -0,0 +1,18 @@
+# Generated by Django 5.2.4 on 2025-11-23 19:38
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('blog', '0007_remove_article_type_remove_links_last_mod_time_and_more'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='article',
+ name='slug',
+ field=models.SlugField(blank=True, max_length=200, null=True, verbose_name='slug'),
+ ),
+ ]
diff --git a/src/DjangoBlog/blog/models.py b/src/DjangoBlog/blog/models.py
index 97c3b66..9e7e949 100644
--- a/src/DjangoBlog/blog/models.py
+++ b/src/DjangoBlog/blog/models.py
@@ -3,10 +3,12 @@
import logging
import re
from abc import abstractmethod
+from django.utils.functional import cached_property
from django.conf import settings
from django.core.exceptions import ValidationError
from django.db import models
+from django.db.models import Count
from django.urls import reverse
from django.utils.timezone import now
from django.utils.translation import gettext_lazy as _
@@ -93,6 +95,7 @@ class Article(BaseModel):
('p', _('Page')), # 静态页面
)
title = models.CharField(_('title'), max_length=200, unique=True) #cll 文章标题
+ slug = models.SlugField(_('slug'), max_length=200, blank=True, null=True) #cll URL友好的标识符
body = MDTextField(_('body')) #cll 文章正文,支持Markdown格式
pub_time = models.DateTimeField(
_('publish time'), blank=False, null=False, default=now) #cll 发布时间
@@ -101,7 +104,7 @@ class Article(BaseModel):
max_length=1,
choices=STATUS_CHOICES,
default='p') #cll 文章状态
- comment_status_field = models.CharField(
+ comment_status = models.CharField(
_('comment status'),
max_length=1,
choices=COMMENT_STATUS,
@@ -156,9 +159,18 @@ class Article(BaseModel):
names.append(category.name)
return names
- #cll 保存文章,更新修改时间
+ #cll 保存文章,更新修改时间并自动生成slug
def save(self, *args, **kwargs):
self.last_modify_time = now()
+ # 自动生成slug
+ if not self.slug:
+ self.slug = slugify(self.title)
+ # 确保slug唯一性
+ original_slug = self.slug
+ counter = 1
+ while Article.objects.filter(slug=self.slug).exclude(id=self.id).exists():
+ self.slug = f"{original_slug}-{counter}"
+ counter += 1
return super().save(*args, **kwargs)
#cll 增加文章浏览次数
@@ -194,6 +206,14 @@ class Article(BaseModel):
return result.group(1)
else:
return None
+
+ @cached_property
+ def likes_count(self):
+ return self.like_set.count()
+
+ @cached_property
+ def favorites_count(self):
+ return self.favorite_set.count()
#xy 分类模型
@@ -271,6 +291,9 @@ class Tag(BaseModel):
verbose_name_plural = verbose_name #zhj 复数形式
+# 文章点赞和收藏模型将在文件末尾使用继承BaseModel的版本定义
+
+
#flj 友情链接模型
class Links(models.Model):
name = models.CharField(_('link name'), max_length=30, unique=True) #flj 链接名称
@@ -316,6 +339,45 @@ class SideBar(models.Model):
#fkc 网站设置模型
+# 点赞模型
+class Like(BaseModel):
+ user = models.ForeignKey(
+ settings.AUTH_USER_MODEL,
+ verbose_name=_('user'),
+ on_delete=models.CASCADE) # 关联用户
+ article = models.ForeignKey(
+ Article,
+ verbose_name=_('article'),
+ on_delete=models.CASCADE) # 关联文章
+
+ class Meta:
+ unique_together = ('user', 'article') # 确保一个用户只能对一篇文章点赞一次
+ verbose_name = _('like')
+ verbose_name_plural = verbose_name
+
+ def __str__(self):
+ return f"{self.user.username} likes {self.article.title}"
+
+# 收藏模型
+class Favorite(BaseModel):
+ user = models.ForeignKey(
+ settings.AUTH_USER_MODEL,
+ verbose_name=_('user'),
+ on_delete=models.CASCADE) # 关联用户
+ article = models.ForeignKey(
+ Article,
+ verbose_name=_('article'),
+ on_delete=models.CASCADE) # 关联文章
+
+ class Meta:
+ unique_together = ('user', 'article') # 确保一个用户只能对一篇文章收藏一次
+ verbose_name = _('favorite')
+ verbose_name_plural = verbose_name
+
+ def __str__(self):
+ return f"{self.user.username} favorites {self.article.title}"
+
+
class BlogSettings(models.Model):
site_name = models.CharField(
_('site name'),
diff --git a/src/DjangoBlog/blog/templates/blog/user_favorites.html b/src/DjangoBlog/blog/templates/blog/user_favorites.html
new file mode 100644
index 0000000..fdbf8ab
--- /dev/null
+++ b/src/DjangoBlog/blog/templates/blog/user_favorites.html
@@ -0,0 +1,64 @@
+{% extends "blog/base.html" %}
+{% load staticfiles %}
+{% load custom_markdown %}
+{% load likes_tags %}
+{% load static %}
+{% block title %}{{ title }} - {{ site_name }}{% endblock %}
+
+{% block content %}
+
+
+
+
+
我的收藏
+ {% if article_list %}
+
+ {% for article in article_list %}
+
+
+
+
+
{{ article.body | custom_markdown | truncatechars:200 }}
+
+
+
+ {% endfor %}
+
+ {% else %}
+
+ {% endif %}
+
+ {% if article_list %}
+
+ {% endif %}
+
+
+
+
+ {% include "blog/right_sidebar.html" %}
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/src/DjangoBlog/blog/tests.py b/src/DjangoBlog/blog/tests.py
index ee13505..45435c2 100644
--- a/src/DjangoBlog/blog/tests.py
+++ b/src/DjangoBlog/blog/tests.py
@@ -59,7 +59,7 @@ class ArticleTest(TestCase):
article.body = "nicecontent"
article.author = user
article.category = category
- article.type = 'a'
+ article.article_type = 'a'
article.status = 'p'
article.save()
@@ -74,7 +74,7 @@ class ArticleTest(TestCase):
article.body = "nicetitle" + str(i)
article.author = user
article.category = category
- article.type = 'a'
+ article.article_type = 'a'
article.status = 'p'
article.save()
article.tags.add(tag)
diff --git a/src/DjangoBlog/blog/urls.py b/src/DjangoBlog/blog/urls.py
index 14aedf2..964786e 100644
--- a/src/DjangoBlog/blog/urls.py
+++ b/src/DjangoBlog/blog/urls.py
@@ -73,4 +73,18 @@ urlpatterns = [
r'clean',
views.clean_cache_view,
name='clean'), # 清除缓存接口
+ # 点赞和收藏功能
+ path(
+ r'article/like/',
+ views.like_article,
+ name='like_article'), # 文章点赞接口
+ path(
+ r'article/favorite/',
+ views.favorite_article,
+ name='favorite_article'), # 文章收藏接口
+ # 我的收藏页面
+ path(
+ r'user/favorites/',
+ views.user_favorites,
+ name='user_favorites'), # 我的收藏页面
]
diff --git a/src/DjangoBlog/blog/views.py b/src/DjangoBlog/blog/views.py
index af3826e..be7aab7 100644
--- a/src/DjangoBlog/blog/views.py
+++ b/src/DjangoBlog/blog/views.py
@@ -20,7 +20,7 @@ from django.views.generic.detail import DetailView # 详情页视图基类
from django.views.generic.list import ListView # 列表页视图基类
from haystack.views import SearchView # 搜索视图
-from blog.models import Article, Category, LinkShowType, Links, Tag
+from blog.models import Article, Category, LinkShowType, Links, Tag, Like, Favorite
from comments.forms import CommentForm
from djangoblog.plugin_manage import hooks # 插件管理
from djangoblog.plugin_manage.hook_constants import ARTICLE_CONTENT_HOOK_NAME
@@ -116,11 +116,38 @@ class ArticleDetailView(DetailView):
#flj 获取文章详情页的上下文数据,包括评论表单、相关文章等
def get_context_data(self, **kwargs):
#flj 调用父类方法获取基础上下文数据
+ kwargs = super(ArticleDetailView, self).get_context_data(**kwargs)
+ article = self.object
+ article.viewed() # 增加浏览次数
+
#flj 添加评论表单
- #flj 获取文章评论列表
- #flj 添加相关文章
+ comments = article.comment_list()
+ comment_form = CommentForm()
+
+ #flj 添加点赞和收藏信息
+ is_liked = False
+ is_favorited = False
+ like_count = article.like_set.count()
+ favorite_count = article.favorite_set.count()
+
+ if self.request.user.is_authenticated:
+ is_liked = Like.objects.filter(user=self.request.user, article=article).exists()
+ is_favorited = Favorite.objects.filter(user=self.request.user, article=article).exists()
+
+ #flj 添加到上下文
+ kwargs['comments'] = comments
+ kwargs['comment_form'] = comment_form
+ kwargs['like_count'] = like_count
+ kwargs['is_liked'] = is_liked
+ kwargs['favorite_count'] = favorite_count
+ kwargs['is_favorited'] = is_favorited
+
#flj 调用插件处理文章内容
- return super().get_context_data(**kwargs)
+ article_content = article.body_to_string()
+ article_content = hooks.call_hook(ARTICLE_CONTENT_HOOK_NAME, request=self.request, content=article_content)
+ article.body = article_content
+
+ return kwargs
#flj 分类详情视图,显示指定分类下的文章列表
@@ -310,3 +337,113 @@ def clean_cache_view(request):
#flj 清理缓存
#flj 返回成功信息
return HttpResponse(_('清理缓存成功'))
+
+# 点赞视图
+@csrf_exempt
+def like_article(request):
+ '''
+ 处理文章点赞
+ '''
+ if request.method == 'POST' and request.user.is_authenticated:
+ try:
+ data = json.loads(request.body)
+ article_id = data.get('article_id')
+ article = Article.objects.get(id=article_id)
+ like, created = Like.objects.get_or_create(user=request.user, article=article)
+
+ if not created:
+ # 如果已经点赞,则取消点赞
+ like.delete()
+
+ # 获取最新的点赞数
+ count = article.like_set.count()
+
+ return HttpResponse(json.dumps({
+ 'status': 'success',
+ 'count': count
+ }), content_type="application/json")
+ except Article.DoesNotExist:
+ return HttpResponse(json.dumps({
+ 'status': 'error',
+ 'message': _('文章不存在')
+ }), content_type="application/json")
+ except Exception as e:
+ return HttpResponse(json.dumps({
+ 'status': 'error',
+ 'message': str(e)
+ }), content_type="application/json")
+
+ return HttpResponse(json.dumps({
+ 'status': 'error',
+ 'message': _('需要登录才能点赞')
+ }), content_type="application/json")
+
+# 收藏视图
+@csrf_exempt
+def favorite_article(request):
+ '''
+ 处理文章收藏
+ '''
+ if request.method == 'POST' and request.user.is_authenticated:
+ try:
+ data = json.loads(request.body)
+ article_id = data.get('article_id')
+ article = Article.objects.get(id=article_id)
+ favorite, created = Favorite.objects.get_or_create(user=request.user, article=article)
+
+ if not created:
+ # 如果已经收藏,则取消收藏
+ favorite.delete()
+
+ # 获取最新的收藏数
+ count = article.favorite_set.count()
+
+ return HttpResponse(json.dumps({
+ 'status': 'success',
+ 'count': count
+ }), content_type="application/json")
+ except Article.DoesNotExist:
+ return HttpResponse(json.dumps({
+ 'status': 'error',
+ 'message': _('文章不存在')
+ }), content_type="application/json")
+ except Exception as e:
+ return HttpResponse(json.dumps({
+ 'status': 'error',
+ 'message': str(e)
+ }), content_type="application/json")
+
+ return HttpResponse(json.dumps({
+ 'status': 'error',
+ 'message': _('需要登录才能收藏')
+ }), content_type="application/json")
+
+# 我的收藏页面视图
+def user_favorites(request):
+ '''
+ 显示用户收藏的文章列表
+ '''
+ if not request.user.is_authenticated:
+ return render(request, ERROR_PAGE_TEMPLATE, {'message': _('请先登录')}, status=403)
+
+ # 获取用户收藏的文章
+ favorites = Favorite.objects.filter(user=request.user).order_by('-created_at')
+
+ # 提取文章并进行分页
+ articles = [fav.article for fav in favorites if fav.article.status == 'p']
+ paginator = Paginator(articles, settings.PAGINATE_BY)
+ page = request.GET.get('page', 1)
+
+ try:
+ article_list = paginator.page(page)
+ except Exception:
+ article_list = paginator.page(1)
+
+ context = {
+ 'article_list': article_list,
+ 'title': _('我的收藏'),
+ 'page_type': '我的收藏',
+ 'has_favorites': len(articles) > 0
+ }
+
+ return render(request, 'blog/user_favorites.html', context)
diff --git a/src/DjangoBlog/comments/tests.py b/src/DjangoBlog/comments/tests.py
index 2a7f55f..3bde98b 100644
--- a/src/DjangoBlog/comments/tests.py
+++ b/src/DjangoBlog/comments/tests.py
@@ -42,7 +42,7 @@ class CommentsTest(TransactionTestCase):
article.body = "nicecontentccc"
article.author = self.user
article.category = category
- article.type = 'a'
+ article.article_type = 'a'
article.status = 'p'
article.save()
diff --git a/src/DjangoBlog/djangoblog/elasticsearch_backend.py b/src/DjangoBlog/djangoblog/elasticsearch_backend.py
index 4afe498..2331cf4 100644
--- a/src/DjangoBlog/djangoblog/elasticsearch_backend.py
+++ b/src/DjangoBlog/djangoblog/elasticsearch_backend.py
@@ -91,7 +91,7 @@ class ElasticSearchBackend(BaseSearchBackend):
search = ArticleDocument.search() \
.query('bool', filter=[q]) \
.filter('term', status='p') \
- .filter('term', type='a') \
+ .filter('term', article_type='a') \
.source(False)[start_offset: end_offset]
results = search.execute()
diff --git a/src/DjangoBlog/djangoblog/feeds.py b/src/DjangoBlog/djangoblog/feeds.py
index 8c4e851..fdfe6c3 100644
--- a/src/DjangoBlog/djangoblog/feeds.py
+++ b/src/DjangoBlog/djangoblog/feeds.py
@@ -21,7 +21,7 @@ class DjangoBlogFeed(Feed):
return get_user_model().objects.first().get_absolute_url()
def items(self):
- return Article.objects.filter(type='a', status='p').order_by('-pub_time')[:5]
+ return Article.objects.filter(article_type='a', status='p').order_by('-pub_time')[:5]
def item_title(self, item):
return item.title
diff --git a/src/DjangoBlog/djangoblog/settings.py b/src/DjangoBlog/djangoblog/settings.py
index 340b902..503d31d 100644
--- a/src/DjangoBlog/djangoblog/settings.py
+++ b/src/DjangoBlog/djangoblog/settings.py
@@ -159,7 +159,7 @@ USE_TZ = False # 不使用UTC时间
# 静态文件配置
STATIC_ROOT = os.path.join(BASE_DIR, 'collectedstatic') # 静态文件收集目录
STATIC_URL = '/static/' # 静态文件URL前缀
-STATICFILES = os.path.join(BASE_DIR, 'static') # 静态文件源目录
+STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')] # 静态文件源目录
# 搜索配置
HAYSTACK_CONNECTIONS = {
@@ -303,8 +303,11 @@ STATICFILES_FINDERS = (
# other
'compressor.finders.CompressorFinder',
)
-COMPRESS_ENABLED = True
-# COMPRESS_OFFLINE = True
+# 在开发环境中动态启用压缩,根据DEBUG状态自动调整
+COMPRESS_ENABLED = not DEBUG # 调试模式下禁用压缩
+COMPRESS_OFFLINE = False # 禁用离线模式
+COMPRESS_ROOT = os.path.join(BASE_DIR, 'static') # 直接指向静态文件源目录
+COMPRESS_URL = STATIC_URL # 确保COMPRESS_URL与STATIC_URL一致
COMPRESS_CSS_FILTERS = [
diff --git a/src/DjangoBlog/servermanager/tests.py b/src/DjangoBlog/servermanager/tests.py
index 22a6689..e57d86e 100644
--- a/src/DjangoBlog/servermanager/tests.py
+++ b/src/DjangoBlog/servermanager/tests.py
@@ -37,7 +37,7 @@ class ServerManagerTest(TestCase):
article.body = "nicecontentccc"
article.author = user
article.category = c
- article.type = 'a'
+ article.article_type = 'a'
article.status = 'p'
article.save()
s = TextMessage([])
diff --git a/src/DjangoBlog/src/accounts/tests.py b/src/DjangoBlog/src/accounts/tests.py
index 6893411..a15ca49 100644
--- a/src/DjangoBlog/src/accounts/tests.py
+++ b/src/DjangoBlog/src/accounts/tests.py
@@ -48,7 +48,7 @@ class AccountTest(TestCase):
article.body = "nicecontentaaa"
article.author = user
article.category = category
- article.type = 'a'
+ article.article_type = 'a'
article.status = 'p'
article.save()
@@ -96,7 +96,7 @@ class AccountTest(TestCase):
article.body = "nicecontentttt"
article.author = user
- article.type = 'a'
+ article.article_type = 'a'
article.status = 'p'
article.save()
diff --git a/src/DjangoBlog/src/blog/documents.py b/src/DjangoBlog/src/blog/documents.py
index 0f1db7b..2d86092 100644
--- a/src/DjangoBlog/src/blog/documents.py
+++ b/src/DjangoBlog/src/blog/documents.py
@@ -197,7 +197,7 @@ class ArticleDocumentManager():
pub_time=article.pub_time,
status=article.status,
comment_status=article.comment_status,
- type=article.type,
+ type=article.article_type,
views=article.views,
article_order=article.article_order) for article in articles]
diff --git a/src/DjangoBlog/src/blog/models.py b/src/DjangoBlog/src/blog/models.py
index 083788b..97e3596 100644
--- a/src/DjangoBlog/src/blog/models.py
+++ b/src/DjangoBlog/src/blog/models.py
@@ -86,7 +86,7 @@ class Article(BaseModel):
max_length=1,
choices=COMMENT_STATUS,
default='o')
- type = models.CharField(_('type'), max_length=1, choices=TYPE, default='a')
+ article_type = models.CharField(_('type'), max_length=1, choices=TYPE, default='a')
views = models.PositiveIntegerField(_('views'), default=0)
author = models.ForeignKey(
settings.AUTH_USER_MODEL,
diff --git a/src/DjangoBlog/src/blog/tests.py b/src/DjangoBlog/src/blog/tests.py
index ee13505..45435c2 100644
--- a/src/DjangoBlog/src/blog/tests.py
+++ b/src/DjangoBlog/src/blog/tests.py
@@ -59,7 +59,7 @@ class ArticleTest(TestCase):
article.body = "nicecontent"
article.author = user
article.category = category
- article.type = 'a'
+ article.article_type = 'a'
article.status = 'p'
article.save()
@@ -74,7 +74,7 @@ class ArticleTest(TestCase):
article.body = "nicetitle" + str(i)
article.author = user
article.category = category
- article.type = 'a'
+ article.article_type = 'a'
article.status = 'p'
article.save()
article.tags.add(tag)
diff --git a/src/DjangoBlog/src/blog/views.py b/src/DjangoBlog/src/blog/views.py
index d5dc7ec..d3d3a51 100644
--- a/src/DjangoBlog/src/blog/views.py
+++ b/src/DjangoBlog/src/blog/views.py
@@ -97,7 +97,7 @@ class IndexView(ArticleListView):
link_type = LinkShowType.I
def get_queryset_data(self):
- article_list = Article.objects.filter(type='a', status='p')
+ article_list = Article.objects.filter(article_type='a', status='p')
return article_list
def get_queryset_cache_key(self):
@@ -216,7 +216,7 @@ class AuthorDetailView(ArticleListView):
def get_queryset_data(self):
author_name = self.kwargs['author_name']
article_list = Article.objects.filter(
- author__username=author_name, type='a', status='p')
+ author__username=author_name, article_type='a', status='p')
return article_list
def get_context_data(self, **kwargs):
@@ -238,7 +238,7 @@ class TagDetailView(ArticleListView):
tag_name = tag.name
self.name = tag_name
article_list = Article.objects.filter(
- tags__name=tag_name, type='a', status='p')
+ tags__name=tag_name, article_type='a', status='p')
return article_list
def get_queryset_cache_key(self):
diff --git a/src/DjangoBlog/src/comments/tests.py b/src/DjangoBlog/src/comments/tests.py
index 2a7f55f..3bde98b 100644
--- a/src/DjangoBlog/src/comments/tests.py
+++ b/src/DjangoBlog/src/comments/tests.py
@@ -42,7 +42,7 @@ class CommentsTest(TransactionTestCase):
article.body = "nicecontentccc"
article.author = self.user
article.category = category
- article.type = 'a'
+ article.article_type = 'a'
article.status = 'p'
article.save()
diff --git a/src/DjangoBlog/src/djangoblog/elasticsearch_backend.py b/src/DjangoBlog/src/djangoblog/elasticsearch_backend.py
index 4afe498..2331cf4 100644
--- a/src/DjangoBlog/src/djangoblog/elasticsearch_backend.py
+++ b/src/DjangoBlog/src/djangoblog/elasticsearch_backend.py
@@ -91,7 +91,7 @@ class ElasticSearchBackend(BaseSearchBackend):
search = ArticleDocument.search() \
.query('bool', filter=[q]) \
.filter('term', status='p') \
- .filter('term', type='a') \
+ .filter('term', article_type='a') \
.source(False)[start_offset: end_offset]
results = search.execute()
diff --git a/src/DjangoBlog/src/djangoblog/feeds.py b/src/DjangoBlog/src/djangoblog/feeds.py
index 8c4e851..fdfe6c3 100644
--- a/src/DjangoBlog/src/djangoblog/feeds.py
+++ b/src/DjangoBlog/src/djangoblog/feeds.py
@@ -21,7 +21,7 @@ class DjangoBlogFeed(Feed):
return get_user_model().objects.first().get_absolute_url()
def items(self):
- return Article.objects.filter(type='a', status='p').order_by('-pub_time')[:5]
+ return Article.objects.filter(article_type='a', status='p').order_by('-pub_time')[:5]
def item_title(self, item):
return item.title
diff --git a/src/DjangoBlog/src/servermanager/tests.py b/src/DjangoBlog/src/servermanager/tests.py
index 22a6689..e57d86e 100644
--- a/src/DjangoBlog/src/servermanager/tests.py
+++ b/src/DjangoBlog/src/servermanager/tests.py
@@ -37,7 +37,7 @@ class ServerManagerTest(TestCase):
article.body = "nicecontentccc"
article.author = user
article.category = c
- article.type = 'a'
+ article.article_type = 'a'
article.status = 'p'
article.save()
s = TextMessage([])
diff --git a/src/DjangoBlog/src/templates/blog/article_detail.html b/src/DjangoBlog/src/templates/blog/article_detail.html
index 3bfa225..31e161a 100644
--- a/src/DjangoBlog/src/templates/blog/article_detail.html
+++ b/src/DjangoBlog/src/templates/blog/article_detail.html
@@ -8,7 +8,7 @@
{% load_article_detail article False user %}
- {% if article.type == 'a' %}
+ {% if article.article_type == 'a' %}