From f0674c29da4a4603e45b19e572b097340b4126fc5c62e0ce99149ce3c5f94b45 Mon Sep 17 00:00:00 2001 From: yuangyaa Date: Fri, 1 Aug 2025 14:39:26 +0800 Subject: [PATCH] Add tempfile --- myblog/blog/migrations/0010_post_status.py | 18 ++++++++ myblog/blog/models.py | 12 ++++- myblog/blog/views.py | 54 +++++++++++++++++++--- 3 files changed, 77 insertions(+), 7 deletions(-) create mode 100644 myblog/blog/migrations/0010_post_status.py diff --git a/myblog/blog/migrations/0010_post_status.py b/myblog/blog/migrations/0010_post_status.py new file mode 100644 index 0000000..2405c4b --- /dev/null +++ b/myblog/blog/migrations/0010_post_status.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1 on 2025-07-31 15:06 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0009_sitesettings_contact_email_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='post', + name='status', + field=models.CharField(choices=[('draft', '草稿'), ('published', '已发布')], default='draft', max_length=10), + ), + ] diff --git a/myblog/blog/models.py b/myblog/blog/models.py index 5a75596..8b41429 100644 --- a/myblog/blog/models.py +++ b/myblog/blog/models.py @@ -36,6 +36,14 @@ class SiteSettings(models.Model): class Post(models.Model): + # 添加状态选项 + DRAFT = 'draft' + PUBLISHED = 'published' + STATUS_CHOICES = [ + (DRAFT, '草稿'), + (PUBLISHED, '已发布'), + ] + title = models.CharField(max_length=100) content = MDTextField() created_at = models.DateTimeField(auto_now_add=True) @@ -43,6 +51,8 @@ class Post(models.Model): publish_date = models.DateTimeField(default=timezone.now) # 添加分类字段,建立外键关系 category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True, blank=True, related_name='posts') + # 添加状态字段 + status = models.CharField(max_length=10, choices=STATUS_CHOICES, default=DRAFT) def __str__(self): return f"{self.title}" @@ -98,4 +108,4 @@ class Post(models.Model): # 将emoji shortcode转换为实际的emoji字符 html_content = emoji.emojize(html_content, language='alias') - return mark_safe(html_content) + return mark_safe(html_content) \ No newline at end of file diff --git a/myblog/blog/views.py b/myblog/blog/views.py index 3a42796..e41f0af 100644 --- a/myblog/blog/views.py +++ b/myblog/blog/views.py @@ -1,6 +1,48 @@ from django.shortcuts import render, get_object_or_404 from .models import Post, Category, SiteSettings +def post_list(request): + # 只显示已发布的文章 + posts = Post.objects.filter(status=Post.PUBLISHED).order_by('-publish_date') + categories = Category.objects.all() + + # 获取站点设置 + site_settings = SiteSettings.objects.first() + summary_length = site_settings.summary_length if site_settings else 50 + + return render(request, 'blog/post_list.html', { + 'posts': posts, + 'categories': categories, + 'summary_length': summary_length + }) + +def post_detail(request, pk): + # 只允许查看已发布的文章 + post = get_object_or_404(Post, pk=pk, status=Post.PUBLISHED) + categories = Category.objects.all() + + return render(request, 'blog/post_detail.html', { + 'post': post, + 'categories': categories + }) + +def category_posts(request, category_id): + category = get_object_or_404(Category, id=category_id) + # 只显示该分类下已发布的文章 + posts = Post.objects.filter(category=category, status=Post.PUBLISHED).order_by('-publish_date') + categories = Category.objects.all() + + # 获取站点设置 + site_settings = SiteSettings.objects.first() + summary_length = site_settings.summary_length if site_settings else 50 + + return render(request, 'blog/post_list.html', { + 'posts': posts, + 'categories': categories, + 'current_category': category, + 'summary_length': summary_length + }) + # Create your views here. @@ -29,16 +71,16 @@ def index(request): if query: # 根据搜索类型执行不同的搜索 if search_type == 'title': - posts = Post.objects.filter(title__icontains=query) + posts = Post.objects.filter(title__icontains=query, status=Post.PUBLISHED) elif search_type == 'content': - posts = Post.objects.filter(content__icontains=query) + posts = Post.objects.filter(content__icontains=query, status=Post.PUBLISHED) else: # 默认按标题和内容搜索 - posts = Post.objects.filter(title__icontains=query) | Post.objects.filter(content__icontains=query) + posts = Post.objects.filter(title__icontains=query, status=Post.PUBLISHED) | Post.objects.filter(content__icontains=query, status=Post.PUBLISHED) elif category_id: - posts = Post.objects.filter(category_id=category_id) + posts = Post.objects.filter(category_id=category_id, status=Post.PUBLISHED) else: - posts = Post.objects.all() + posts = Post.objects.filter(status=Post.PUBLISHED) posts = posts.order_by('-publish_date').distinct() @@ -59,7 +101,7 @@ def index(request): def detail(request, post_id): - post = get_object_or_404(Post, pk=post_id) + post = get_object_or_404(Post, pk=post_id, status=Post.PUBLISHED) categories = Category.objects.all() # 获取所有分类用于侧边栏 try: site_settings = SiteSettings.objects.first()