From a9395660f5ee9533bf03b82e286883f627741b9c Mon Sep 17 00:00:00 2001 From: flj666 <2655425867@qq.com> Date: Sat, 29 Nov 2025 09:31:49 +0800 Subject: [PATCH] Update code --- ...泛读、标注和维护报告文档.docx | Bin 162 -> 0 bytes query | 1 + src/DjangoBlog/accounts/tests.py | 4 +- src/DjangoBlog/blog/admin.py | 4 +- src/DjangoBlog/blog/context_processors.py | 2 +- src/DjangoBlog/blog/documents.py | 2 +- ...ype_remove_links_last_mod_time_and_more.py | 90 +++++++++++ .../blog/migrations/0008_article_slug.py | 18 +++ src/DjangoBlog/blog/models.py | 66 +++++++- .../blog/templates/blog/user_favorites.html | 64 ++++++++ src/DjangoBlog/blog/tests.py | 4 +- src/DjangoBlog/blog/urls.py | 14 ++ src/DjangoBlog/blog/views.py | 145 +++++++++++++++++- src/DjangoBlog/comments/tests.py | 2 +- .../djangoblog/elasticsearch_backend.py | 2 +- src/DjangoBlog/djangoblog/feeds.py | 2 +- src/DjangoBlog/djangoblog/settings.py | 9 +- src/DjangoBlog/servermanager/tests.py | 2 +- src/DjangoBlog/src/accounts/tests.py | 4 +- src/DjangoBlog/src/blog/documents.py | 2 +- src/DjangoBlog/src/blog/models.py | 2 +- src/DjangoBlog/src/blog/tests.py | 4 +- src/DjangoBlog/src/blog/views.py | 6 +- src/DjangoBlog/src/comments/tests.py | 2 +- .../src/djangoblog/elasticsearch_backend.py | 2 +- src/DjangoBlog/src/djangoblog/feeds.py | 2 +- src/DjangoBlog/src/servermanager/tests.py | 2 +- .../src/templates/blog/article_detail.html | 2 +- .../src/templates/blog/tags/article_info.html | 2 +- .../blog/tags/article_meta_info.html | 2 +- .../templates/blog/article_detail.html | 2 +- .../templates/blog/tags/article_info.html | 78 +++++++++- .../blog/tags/article_meta_info.html | 2 +- .../templates/blog/user_favorites.html | 139 +++++++++++++++++ .../templates/share_layout/nav.html | 5 + 35 files changed, 649 insertions(+), 40 deletions(-) delete mode 100644 doc/~$软件泛读、标注和维护报告文档.docx create mode 100644 query create mode 100644 src/DjangoBlog/blog/migrations/0007_remove_article_type_remove_links_last_mod_time_and_more.py create mode 100644 src/DjangoBlog/blog/migrations/0008_article_slug.py create mode 100644 src/DjangoBlog/blog/templates/blog/user_favorites.html create mode 100644 src/DjangoBlog/templates/blog/user_favorites.html diff --git a/doc/~$软件泛读、标注和维护报告文档.docx b/doc/~$软件泛读、标注和维护报告文档.docx deleted file mode 100644 index 21eef571e8c24f50ff825f3cc8e0e7a15b3eea42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162 zcmZSEe(}JmeSaB91I!GTz2fQ8Aq)(?QorgM7#6IPJDtbGz_6jUp9N$VjFy+SKrtAo m1Pox}Z)UPQ3yZnK$nfyYEUrohhUoj=3u8chC@5-5k^%r(xE-_r 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.author.username }} + {{ article.views }} 阅读 + + {{ article.total_favorites }} 收藏 + {{ article.created_time }} +
+
+

{{ 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' %}