Compare commits
1 Commits
master
...
yxt_branch
| Author | SHA1 | Date |
|---|---|---|
|
|
7a78ed45a5 | 4 months ago |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,4 +1,5 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class BlogConfig(AppConfig):
|
||||
name = 'blog' # 应用名称
|
||||
name = 'blog' # 指定应用的Python路径为'blog'
|
||||
@ -1,6 +1,20 @@
|
||||
# 继承 Haystack 搜索表单,自定义查询字段
|
||||
import logging
|
||||
|
||||
from django import forms
|
||||
from haystack.forms import SearchForm
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class BlogSearchForm(SearchForm):
|
||||
querydata = forms.CharField(required=True)
|
||||
querydata = forms.CharField(required=True) # 搜索查询字段,必须填写
|
||||
|
||||
def search(self):
|
||||
# 可加入日志等处理
|
||||
return super().search()
|
||||
# 重写搜索方法
|
||||
datas = super(BlogSearchForm, self).search() # 调用父类的搜索方法
|
||||
if not self.is_valid(): # 检查表单是否有效
|
||||
return self.no_query_found() # 返回无查询结果
|
||||
|
||||
if self.cleaned_data['querydata']:
|
||||
logger.info(self.cleaned_data['querydata']) # 记录搜索查询日志
|
||||
return datas # 返回搜索结果
|
||||
@ -1,62 +1,49 @@
|
||||
from django.contrib.auth import get_user_model # Django 提供的获取用户模型的方法
|
||||
from django.contrib.auth.hashers import make_password # 用于密码加密
|
||||
from django.contrib.auth import get_user_model
|
||||
from django.contrib.auth.hashers import make_password
|
||||
from django.core.management.base import BaseCommand
|
||||
|
||||
# 引入文章、标签、分类模型
|
||||
from blog.models import Article, Tag, Category
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = '创建测试数据' # 用于生成一些假数据,便于前端展示和功能测试
|
||||
help = 'create test datas' # 命令帮助信息:创建测试数据
|
||||
|
||||
def handle(self, *args, **options):
|
||||
# 创建或获取一个测试用户
|
||||
# 处理命令的主方法
|
||||
# 获取或创建测试用户
|
||||
user = get_user_model().objects.get_or_create(
|
||||
email='test@test.com',
|
||||
username='测试用户',
|
||||
password=make_password('test!q@w#eTYU') # 对明文密码进行哈希加密
|
||||
)[0]
|
||||
email='test@test.com', username='测试用户', password=make_password('test!q@w#eTYU'))[0]
|
||||
|
||||
# 创建或获取一个父级分类
|
||||
# 获取或创建父类目
|
||||
pcategory = Category.objects.get_or_create(
|
||||
name='我是父类目',
|
||||
parent_category=None # 表示没有父分类,即为顶级分类
|
||||
)[0]
|
||||
name='我是父类目', parent_category=None)[0]
|
||||
|
||||
# 创建或获取一个子分类,其父分类为上面创建的 pcategory
|
||||
# 获取或创建子类目
|
||||
category = Category.objects.get_or_create(
|
||||
name='子类目',
|
||||
parent_category=pcategory
|
||||
)[0]
|
||||
category.save() # 保存分类对象
|
||||
name='子类目', parent_category=pcategory)[0]
|
||||
|
||||
# 创建一个基础标签
|
||||
category.save() # 保存子类目
|
||||
# 创建基础标签
|
||||
basetag = Tag()
|
||||
basetag.name = "标签"
|
||||
basetag.save()
|
||||
|
||||
# 循环创建 1~19 号文章,每篇文章都绑定到上面创建的子分类
|
||||
# 循环创建测试文章
|
||||
for i in range(1, 20):
|
||||
# 获取或创建文章
|
||||
article = Article.objects.get_or_create(
|
||||
category=category, # 关联分类
|
||||
title='nice title ' + str(i), # 标题
|
||||
body='nice content ' + str(i), # 正文内容
|
||||
author=user # 作者
|
||||
)[0]
|
||||
|
||||
# 为每篇文章创建一个独立标签,如 标签1、标签2 ...
|
||||
category=category,
|
||||
title='nice title ' + str(i),
|
||||
body='nice content ' + str(i),
|
||||
author=user)[0]
|
||||
# 创建文章专属标签
|
||||
tag = Tag()
|
||||
tag.name = "标签" + str(i)
|
||||
tag.save()
|
||||
|
||||
# 将独立标签和基础标签都添加到文章的标签集合中
|
||||
# 为文章添加标签
|
||||
article.tags.add(tag)
|
||||
article.tags.add(basetag)
|
||||
article.save() # 保存文章与标签的关联关系
|
||||
article.save() # 保存文章
|
||||
|
||||
# 清空缓存,确保新生成的数据能及时被正确索引或展示
|
||||
from djangoblog.utils import cache
|
||||
cache.clear()
|
||||
|
||||
# 输出成功提示
|
||||
self.stdout.write(self.style.SUCCESS('已创建测试数据 \n'))
|
||||
cache.clear() # 清除缓存
|
||||
self.stdout.write(self.style.SUCCESS('created test datas \n')) # 输出成功信息
|
||||
@ -1,197 +0,0 @@
|
||||
# Generated by Django 5.2.6 on 2025-11-16 17:01
|
||||
|
||||
import django.db.models.deletion
|
||||
import django.utils.timezone
|
||||
import mdeditor.fields
|
||||
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.AlterModelOptions(
|
||||
name='article',
|
||||
options={'get_latest_by': 'id', 'ordering': ['-article_order', '-pub_time'], 'verbose_name': '文章', 'verbose_name_plural': '文章'},
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name='blogsettings',
|
||||
options={'verbose_name': '网站配置', 'verbose_name_plural': '网站配置'},
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name='category',
|
||||
options={'ordering': ['-index'], 'verbose_name': '分类', 'verbose_name_plural': '分类'},
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name='links',
|
||||
options={'ordering': ['sequence'], 'verbose_name': '友情链接', 'verbose_name_plural': '友情链接'},
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name='sidebar',
|
||||
options={'ordering': ['sequence'], 'verbose_name': '侧边栏', 'verbose_name_plural': '侧边栏'},
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name='tag',
|
||||
options={'ordering': ['name'], 'verbose_name': '标签', 'verbose_name_plural': '标签'},
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='article',
|
||||
name='article_order',
|
||||
field=models.IntegerField(default=0, verbose_name='排序'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='article',
|
||||
name='body',
|
||||
field=mdeditor.fields.MDTextField(verbose_name='内容'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='article',
|
||||
name='comment_status',
|
||||
field=models.CharField(choices=[('o', '开放评论'), ('c', '关闭评论')], default='o', max_length=1, verbose_name='评论状态'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='article',
|
||||
name='creation_time',
|
||||
field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='创建时间'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='article',
|
||||
name='last_modify_time',
|
||||
field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='修改时间'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='article',
|
||||
name='show_toc',
|
||||
field=models.BooleanField(default=False, verbose_name='显示目录'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='article',
|
||||
name='status',
|
||||
field=models.CharField(choices=[('d', '草稿'), ('p', '发布')], default='p', max_length=1, verbose_name='状态'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='article',
|
||||
name='tags',
|
||||
field=models.ManyToManyField(blank=True, to='blog.tag', verbose_name='标签'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='blogsettings',
|
||||
name='article_comment_count',
|
||||
field=models.IntegerField(default=5, verbose_name='文章评论数量'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='blogsettings',
|
||||
name='google_adsense_codes',
|
||||
field=models.TextField(blank=True, default='', max_length=2000, null=True, verbose_name='Google广告代码'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='blogsettings',
|
||||
name='open_site_comment',
|
||||
field=models.BooleanField(default=True, verbose_name='开放站点评论'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='blogsettings',
|
||||
name='show_google_adsense',
|
||||
field=models.BooleanField(default=False, verbose_name='显示Google广告'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='blogsettings',
|
||||
name='sidebar_article_count',
|
||||
field=models.IntegerField(default=10, verbose_name='侧边栏文章数量'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='blogsettings',
|
||||
name='sidebar_comment_count',
|
||||
field=models.IntegerField(default=5, verbose_name='侧边栏评论数量'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='blogsettings',
|
||||
name='site_description',
|
||||
field=models.TextField(default='', max_length=1000, verbose_name='站点描述'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='blogsettings',
|
||||
name='site_keywords',
|
||||
field=models.TextField(default='', max_length=1000, verbose_name='站点关键词'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='blogsettings',
|
||||
name='site_name',
|
||||
field=models.CharField(default='', max_length=200, verbose_name='站点名称'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='blogsettings',
|
||||
name='site_seo_description',
|
||||
field=models.TextField(default='', max_length=1000, verbose_name='SEO描述'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='category',
|
||||
name='creation_time',
|
||||
field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='创建时间'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='category',
|
||||
name='index',
|
||||
field=models.IntegerField(default=0, verbose_name='排序'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='category',
|
||||
name='last_modify_time',
|
||||
field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='修改时间'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='category',
|
||||
name='name',
|
||||
field=models.CharField(max_length=30, unique=True, verbose_name='分类名称'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='links',
|
||||
name='creation_time',
|
||||
field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='创建时间'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='links',
|
||||
name='show_type',
|
||||
field=models.CharField(choices=[('i', '首页'), ('l', '列表页'), ('p', '文章页'), ('a', '全部'), ('s', '幻灯片')], default='i', max_length=1, verbose_name='显示位置'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='sidebar',
|
||||
name='creation_time',
|
||||
field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='创建时间'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='tag',
|
||||
name='creation_time',
|
||||
field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='创建时间'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='tag',
|
||||
name='last_modify_time',
|
||||
field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='修改时间'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='tag',
|
||||
name='name',
|
||||
field=models.CharField(max_length=30, unique=True, verbose_name='标签名称'),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='ArticleLike',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('created_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='点赞时间')),
|
||||
('article', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='article_likes', to='blog.article', verbose_name='文章')),
|
||||
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='用户')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': '文章点赞',
|
||||
'verbose_name_plural': '文章点赞',
|
||||
'ordering': ['-created_time'],
|
||||
'unique_together': {('article', 'user')},
|
||||
},
|
||||
),
|
||||
]
|
||||
@ -1,18 +0,0 @@
|
||||
# Generated by Django 5.2.6 on 2025-11-16 17:08
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('blog', '0007_alter_article_options_alter_blogsettings_options_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='article',
|
||||
name='like_count',
|
||||
field=models.PositiveIntegerField(default=0, verbose_name='点赞数'),
|
||||
),
|
||||
]
|
||||
@ -1,32 +0,0 @@
|
||||
# Generated by Django 5.2.6 on 2025-11-16 18:43
|
||||
|
||||
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', '0008_article_like_count'),
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='ArticleFavorite',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('created_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='收藏时间')),
|
||||
('article', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='article_favorites', to='blog.article', verbose_name='文章')),
|
||||
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='用户')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': '文章收藏',
|
||||
'verbose_name_plural': '文章收藏',
|
||||
'ordering': ['-created_time'],
|
||||
'unique_together': {('article', 'user')},
|
||||
},
|
||||
),
|
||||
]
|
||||
@ -1,18 +0,0 @@
|
||||
# Generated by Django 5.2.6 on 2025-11-16 19:04
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('blog', '0009_articlefavorite'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='article',
|
||||
name='favorite_count',
|
||||
field=models.PositiveIntegerField(default=0, verbose_name='收藏数'),
|
||||
),
|
||||
]
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue