Compare commits

..

59 Commits

Author SHA1 Message Date
pu685px73 b84a4636b8 ADD file via upload
4 months ago
pu685px73 cc72205f7b ADD file via upload
4 months ago
pu685px73 59198b6ef4 ADD file via upload
4 months ago
pu685px73 14ae1ee140 ADD file via upload
4 months ago
pu685px73 aa3da56be8 ADD file via upload
4 months ago
pu685px73 94f9530594 ADD file via upload
4 months ago
pu685px73 302503775c ADD file via upload
4 months ago
pu685px73 ed4ec24e39 ADD file via upload
4 months ago
pu685px73 ad6a8da984 ADD file via upload
4 months ago
pu685px73 dd7abc979c ADD file via upload
4 months ago
pu685px73 ddd8b6ca42 ADD file via upload
4 months ago
pu685px73 1306cc26df ADD file via upload
4 months ago
pu685px73 7f58515a0d ADD file via upload
4 months ago
pu685px73 9c1b640398 ADD file via upload
4 months ago
pu685px73 1313ac2702 ADD file via upload
4 months ago
pu685px73 ef41edfb9f ADD file via upload
4 months ago
pu685px73 f707a5cfb2 ADD file via upload
4 months ago
pu685px73 bbe481bd73 ADD file via upload
4 months ago
pu685px73 19e3e20724 ADD file via upload
4 months ago
pu685px73 e3d1462ab5 ADD file via upload
4 months ago
pu685px73 ae7972a233 ADD file via upload
4 months ago
pu685px73 343b352824 ADD file via upload
4 months ago
pu685px73 0a71263a98 ADD file via upload
4 months ago
pu685px73 892e93c728 ADD file via upload
4 months ago
pu685px73 8788617476 ADD file via upload
4 months ago
pu685px73 63c669b1e8 ADD file via upload
4 months ago
pu685px73 ca64e1e03e ADD file via upload
4 months ago
pu685px73 e7fe4f236a ADD file via upload
4 months ago
pu685px73 c1da8d414f ADD file via upload
4 months ago
pu685px73 ff4ae7672f Delete 'src/comments/__pycache__/ admin.cpython-312.pyc'
4 months ago
pu685px73 5d794c150b ADD file via upload
4 months ago
pu685px73 b8e3bc6fc0 Delete 'src/comments/__pycache__/ __init__.cpython-312.pyc'
4 months ago
pu685px73 1dc56841bc ADD file via upload
4 months ago
pu685px73 f05deb4f4b ADD file via upload
4 months ago
pu685px73 cbb33c4ddc ADD file via upload
4 months ago
pu685px73 778adb3c98 Delete 'comment'
4 months ago
pu685px73 f633cd6dc7 ADD file via upload
4 months ago
pu685px73 3c05c696ff Delete 'src/comments'
4 months ago
pu685px73 a87f385f6e 1
4 months ago
pu685px73 0a380a6067 Delete 'src/__pycache__'
4 months ago
pu685px73 775e437dd3 Add __pycache__
4 months ago
pu685px73 2853092d52 Delete 'src/__pycache__'
4 months ago
pu685px73 4f326fcbcc ADD file via upload
4 months ago
pu685px73 bd325ddb00 Delete 's'
4 months ago
pu685px73 12316252a7 ADD file via upload
4 months ago
pu685px73 4856f61de3 Delete 'src/1'
4 months ago
pu685px73 37c3621f54 Delete 'src/bb'
4 months ago
pu685px73 f91f89b055 Add bb
4 months ago
pu685px73 c03d77d5ce Delete 'ddd'
4 months ago
pu685px73 7dad061f41 Delete 'bb'
4 months ago
pu685px73 dd131d8217 ADD file via upload
4 months ago
pu685px73 4c20cda373 ADD file via upload
4 months ago
pu685px73 f52ab27273 Add 1
4 months ago
pu685px73 c512dc8c63 ADD file via upload
4 months ago
pu685px73 54a46fb553 ADD file via upload
4 months ago
pu685px73 6257f61e35 Merge pull request '2' (#6) from zjy_branch into develop
5 months ago
pjf284zq7 bed7097354 Merge pull request '1' (#5) from lm_branch into develop
5 months ago
pu685px73 547d184482 Update README.md
5 months ago
pu685px73 971c23ee3b Update README.md
5 months ago

@ -0,0 +1,2 @@
# homework

@ -0,0 +1 @@
基于Python的Hello World

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -0,0 +1,72 @@
#zjy 评论模块的Django Admin配置
#zjy 自定义评论在Django后台的管理界面
from django.contrib import admin
from django.urls import reverse
from django.utils.html import format_html
from django.utils.translation import gettext_lazy as _
#zjy 批量禁用评论(将 is_enable 设为 False
def disable_commentstatus(modeladmin, request, queryset):
queryset.update(is_enable=False)
#zjy 批量启用评论(将 is_enable 设为 True
def enable_commentstatus(modeladmin, request, queryset):
queryset.update(is_enable=True)
#zjy 定义动作名称,在 Django Admin 批量操作菜单中显示的文字
disable_commentstatus.short_description = _('Disable comments')
enable_commentstatus.short_description = _('Enable comments')
class CommentAdmin(admin.ModelAdmin):
#zjy 每页显示评论数量
list_per_page = 20
#zjy 在评论列表中显示哪些字段
list_display = (
'id',
'body', #zjy 评论正文
'link_to_userinfo', #zjy 用户信息(带链接)
'link_to_article', #zjy 所属文章(带链接)
'is_enable', #zjy 是否启用
'creation_time' #zjy 创建时间
)
#zjy 可以点击哪些字段进入编辑页面
list_display_links = ('id', 'body', 'is_enable')
#zjy 过滤器(后台右侧筛选功能)
list_filter = ('is_enable',)
#zjy 排除不需要在后台编辑的字段(自动时间字段不应手动修改)
exclude = ('creation_time', 'last_modify_time')
#zjy 批量操作按钮
actions = [disable_commentstatus, enable_commentstatus]
#zjy 显示用户信息,并可点击跳转到用户编辑页面
def link_to_userinfo(self, obj):
#zjy 获取目标 admin change 页面的 URL 路径
info = (obj.author._meta.app_label, obj.author._meta.model_name)
link = reverse('admin:%s_%s_change' % info, args=(obj.author.id,))
#zjy 显示用户昵称,若无昵称显示 email
return format_html(
'<a href="{}">{}</a>'.format(
link,
obj.author.nickname if obj.author.nickname else obj.author.email
)
)
#zjy 显示所属文章,并可点击跳转到文章编辑页面
def link_to_article(self, obj):
info = (obj.article._meta.app_label, obj.article._meta.model_name)
link = reverse('admin:%s_%s_change' % info, args=(obj.article.id,))
return format_html('<a href="{}">{}</a>'.format(link, obj.article.title))
#zjy 设置在后台列表中显示的列标题
link_to_userinfo.short_description = _('User')
link_to_article.short_description = _('Article')

@ -0,0 +1,13 @@
#zjy 评论模块的应用配置
#zjy 定义评论应用的配置信息
from django.apps import AppConfig
class CommentsConfig(AppConfig):
#zjy 指定该 App 在项目中的名称(即所在目录名)
name = 'comments'
#zjy (可选)可以在这里做初始化操作,如引入 signals
# def ready(self):
# import comments.signals

@ -0,0 +1,24 @@
#zjy 评论模块的表单定义
#zjy 定义评论提交的表单验证规则
from django import forms
from django.forms import ModelForm
from .models import Comment
class CommentForm(ModelForm):
#zjy 用于存储父评论的 ID实现评论回复功能
#zjy 该字段不会显示到页面中HiddenInput允许为空一级评论时为空
parent_comment_id = forms.IntegerField(
widget=forms.HiddenInput,
required=False
)
class Meta:
#zjy 指定该表单操作的模型为 Comment
model = Comment
#zjy 只允许用户输入评论内容body
#zjy 其他字段(如 author、article、parent_comment将在视图中自动赋值
fields = ['body']

@ -0,0 +1,65 @@
# Generated by Django 4.1.7 on 2023-03-02 07:14
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
class Migration(migrations.Migration):
# 表示这是该 app 的第一个迁移文件
initial = True
dependencies = [
# 依赖 blog 应用的第一条迁移文件,确保 Article 模型已经被创建
('blog', '0001_initial'),
# 依赖 Django 的用户模型(可自定义 AUTH_USER_MODEL
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
# 创建 Comment 模型
migrations.CreateModel(
name='Comment',
fields=[
# 主键 id自动递增
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
# 评论内容,最大长度 300 字
('body', models.TextField(max_length=300, verbose_name='正文')),
# 评论创建时间,默认取当前时间
('created_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='创建时间')),
# 评论最后一次修改时间,默认也为当前时间
('last_mod_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='修改时间')),
# 评论是否显示,后台可控制隐藏
('is_enable', models.BooleanField(default=True, verbose_name='是否显示')),
# 评论所属文章,一个评论只能属于一篇文章
# CASCADE 表示当文章删除时,该评论也会被删除
('article', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='blog.article', verbose_name='文章')),
# 评论作者,关联用户模型
('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='作者')),
# 父评论,用于实现评论/回复功能
# 允许为空(空代表这是一级评论)
# 父评论删除时,子评论也删除
('parent_comment', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='comments.comment', verbose_name='上级评论')),
],
options={
# 后台显示名
'verbose_name': '评论',
'verbose_name_plural': '评论',
# 查询时默认按 id 倒序排列(新的评论排最前)
'ordering': ['-id'],
# get_latest_by 用于 Django 的 latest() 方法
'get_latest_by': 'id',
},
),
]

@ -0,0 +1,21 @@
from django.db import migrations, models
class Migration(migrations.Migration):
# 当前迁移文件依赖于 comments 应用的 0001 初始迁移文件
dependencies = [
('comments', '0001_initial'),
]
operations = [
# 修改 Comment 模型中 is_enable 字段的属性
migrations.AlterField(
model_name='comment', # 要修改的模型名称
name='is_enable', # 要修改的字段名
field=models.BooleanField(
default=False, # 将默认值改为 False即默认评论不显示
verbose_name='是否显示' # 后台显示名称
),
),
]

@ -0,0 +1,111 @@
# Generated by Django 4.2.5 on 2023-09-06 13:13
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
class Migration(migrations.Migration):
# 迁移依赖顺序,确保其他相关模型先完成迁移
dependencies = [
# 依赖用户模型(可自定义 AUTH_USER_MODEL
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
# 依赖 blog 应用的某次迁移文件
('blog', '0005_alter_article_options_alter_category_options_and_more'),
# 依赖 comments 应用之前的迁移调整(包括 is_enable 字段的变更)
('comments', '0002_alter_comment_is_enable'),
]
operations = [
# 修改模型的元选项Meta 类中的配置)
migrations.AlterModelOptions(
name='comment',
options={
'get_latest_by': 'id', # 使用 id 作为 latest() 的默认排序依据
'ordering': ['-id'], # 查询结果默认按 id 降序排列(新评论在前)
'verbose_name': 'comment', # 后台显示名称(单数)
'verbose_name_plural': 'comment', # 后台显示名称(复数)
},
),
# 删除原来用于记录创建时间的字段 created_time
migrations.RemoveField(
model_name='comment',
name='created_time',
),
# 删除原来用于记录修改时间的字段 last_mod_time
migrations.RemoveField(
model_name='comment',
name='last_mod_time',
),
# 新增评论创建时间字段(命名和 verbose_name 英文化)
migrations.AddField(
model_name='comment',
name='creation_time',
field=models.DateTimeField(
default=django.utils.timezone.now,
verbose_name='creation time',
),
),
# 新增评论最后修改时间字段(命名和 verbose_name 英文化)
migrations.AddField(
model_name='comment',
name='last_modify_time',
field=models.DateTimeField(
default=django.utils.timezone.now,
verbose_name='last modify time',
),
),
# 修改外键 article 字段的 verbose_name 显示文本
migrations.AlterField(
model_name='comment',
name='article',
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, # 文章删除时,本评论也删除
to='blog.article',
verbose_name='article',
),
),
# 修改外键 author 字段的 verbose_name 显示文本
migrations.AlterField(
model_name='comment',
name='author',
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, # 用户删除时,评论也删除
to=settings.AUTH_USER_MODEL,
verbose_name='author',
),
),
# 修改评论是否显示字段,将 verbose_name 英文化,默认不显示
migrations.AlterField(
model_name='comment',
name='is_enable',
field=models.BooleanField(
default=False,
verbose_name='enable', # 从中文变为英文显示
),
),
# 修改父评论字段(用于实现评论回复结构)
migrations.AlterField(
model_name='comment',
name='parent_comment',
field=models.ForeignKey(
blank=True, # 表单中允许为空
null=True, # 数据库中允许为 null
on_delete=django.db.models.deletion.CASCADE, # 父评论删除时子评论也删除
to='comments.comment',
verbose_name='parent comment',
),
),
]

@ -0,0 +1,74 @@
#zjy 评论模块的数据模型定义
#zjy 定义了Comment模型用于存储博客文章的评论信息支持多级回复功能
from django.conf import settings
from django.db import models
from django.utils.timezone import now
from django.utils.translation import gettext_lazy as _
from blog.models import Article
class Comment(models.Model):
#zjy 评论正文,限制最大输入长度 300使用 TextField 以便输入多行内容
body = models.TextField('正文', max_length=300)
#zjy 评论创建时间,默认使用 timezone.now可自动获取当前时区时间
creation_time = models.DateTimeField(
_('creation time'),
default=now
)
#zjy 评论最后修改时间,通常用于编辑评论功能,但如果不编辑也会保持不变
last_modify_time = models.DateTimeField(
_('last modify time'),
default=now
)
#zjy 评论作者,关联到用户模型,用户删除时,对应评论也一并删除
author = models.ForeignKey(
settings.AUTH_USER_MODEL,
verbose_name=_('author'),
on_delete=models.CASCADE
)
#zjy 评论所属文章,关联到 Article 模型,文章被删除时,其下所有评论也被删除
article = models.ForeignKey(
Article,
verbose_name=_('article'),
on_delete=models.CASCADE
)
#zjy 父评论,用于构建"评论回复"树结构
#zjy 若为空 → 表示为一级评论;不为空 → 表示为某条评论的子评论
parent_comment = models.ForeignKey(
'self', #zjy 自关联
verbose_name=_('parent comment'),
blank=True, #zjy 表单中允许为空
null=True, #zjy 数据库允许为 null
on_delete=models.CASCADE #zjy 父评论删除时,子评论也被删除
)
#zjy 是否启用评论(常用于需要审核评论是否展示)
#zjy 默认为 False → 新评论不会立刻显示,需要管理员审核启用
is_enable = models.BooleanField(
_('enable'),
default=False,
blank=False,
null=False
)
class Meta:
#zjy 默认按 id 倒序排列 → 新评论显示在前
ordering = ['-id']
#zjy Django Admin 后台显示的模型名称
verbose_name = _('comment')
verbose_name_plural = verbose_name
#zjy latest() 方法依据 id 获取最新对象
get_latest_by = 'id'
def __str__(self):
#zjy 后台及 shell 打印对象时显示评论内容
return self.body

@ -0,0 +1,55 @@
from django import template
# 注册一个自定义标签库
register = template.Library()
@register.simple_tag
def parse_commenttree(commentlist, comment):
"""
获取指定评论的所有子评论包括多级递归子评论
用法示例在模板中:
{% parse_commenttree article_comments comment as childcomments %}
参数解释
commentlist所有评论的查询集合一般是 article.comments.all()
comment当前评论对象
返回值
datas按层级顺序递归展开的所有子评论列表
"""
datas = [] # 用于存储递归解析得到的子评论
def parse(c):
# 找到当前评论 c 的直接子评论(过滤掉未启用的)
childs = commentlist.filter(parent_comment=c, is_enable=True)
for child in childs:
datas.append(child) # 保存子评论
parse(child) # 递归查找子评论的子评论
parse(comment)
return datas # 返回递归展开的所有子级评论
@register.inclusion_tag('comments/tags/comment_item.html')
def show_comment_item(comment, ischild):
"""
渲染评论项组件
用法示例在模板中
{% show_comment_item comment True %}
参数
comment需要渲染的评论对象
ischild是否为子评论用于模板样式控制如缩进/层级
depth 解释
depth = 1 子评论缩进更深
depth = 2 顶级评论缩进较浅
"""
depth = 1 if ischild else 2
return {
'comment_item': comment, # 提供给模板的评论对象
'depth': depth # 让模板根据层级调整样式
}

@ -0,0 +1,131 @@
#zjy 评论模块的测试用例
#zjy 测试评论的提交、审核、显示和邮件通知等功能
from django.test import Client, RequestFactory, TransactionTestCase
from django.urls import reverse
from accounts.models import BlogUser
from blog.models import Category, Article
from comments.models import Comment
from comments.templatetags.comments_tags import *
from djangoblog.utils import get_max_articleid_commentid
class CommentsTest(TransactionTestCase):
#zjy 评论相关功能测试类
#zjy 使用 TransactionTestCase 允许测试包含事务的数据库操作
def setUp(self):
#zjy 测试初始化工作:
#zjy - 创建请求客户端
#zjy - 配置博客系统为"评论需要审核"
#zjy - 创建一个超级管理员用户(用于登录发表评论)
self.client = Client()
self.factory = RequestFactory()
from blog.models import BlogSettings
value = BlogSettings()
value.comment_need_review = True #zjy 开启评论审核,提交的评论默认不显示
value.save()
#zjy 创建可登录的超级管理员用户
self.user = BlogUser.objects.create_superuser(
email="liangliangyy1@gmail.com",
username="liangliangyy1",
password="liangliangyy1"
)
def update_article_comment_status(self, article):
#zjy 将文章下所有评论改为 is_enable=True
#zjy 模拟管理员审核通过评论(使评论显示)
comments = article.comment_set.all()
for comment in comments:
comment.is_enable = True
comment.save()
def test_validate_comment(self):
#zjy 测试评论提交、审核、评论树解析等功能流程
#zjy 登录用户
self.client.login(username='liangliangyy1', password='liangliangyy1')
#zjy 创建分类
category = Category()
category.name = "categoryccc"
category.save()
#zjy 创建文章
article = Article()
article.title = "nicetitleccc"
article.body = "nicecontentccc"
article.author = self.user
article.category = category
article.type = 'a'
article.status = 'p'
article.save()
#zjy 文章评论提交 URL
comment_url = reverse('comments:postcomment', kwargs={'article_id': article.id})
#zjy 用户提交第一条评论
response = self.client.post(comment_url, {'body': '123ffffffffff'})
self.assertEqual(response.status_code, 302) #zjy 正常应重定向(提交成功)
#zjy 因为评论需要审核,未批准前评论数为 0
article = Article.objects.get(pk=article.pk)
self.assertEqual(len(article.comment_list()), 0)
#zjy 模拟管理员审核评论
self.update_article_comment_status(article)
self.assertEqual(len(article.comment_list()), 1)
#zjy 提交第二条评论
response = self.client.post(comment_url, {'body': '123ffffffffff'})
self.assertEqual(response.status_code, 302)
article = Article.objects.get(pk=article.pk)
self.update_article_comment_status(article)
self.assertEqual(len(article.comment_list()), 2)
#zjy 回复第一条评论(测试 parent_comment 功能)
parent_comment_id = article.comment_list()[0].id
response = self.client.post(comment_url, {
'body': '''
# Title1
```python
import os
```
[url](https://www.lylinux.net/)
[ddd](http://www.baidu.com)
''',
'parent_comment_id': parent_comment_id
})
self.assertEqual(response.status_code, 302)
#zjy 通过审核
self.update_article_comment_status(article)
#zjy 再次获取文章
article = Article.objects.get(pk=article.pk)
self.assertEqual(len(article.comment_list()), 3)
#zjy 测试评论树解析
comment = Comment.objects.get(id=parent_comment_id)
tree = parse_commenttree(article.comment_list(), comment)
self.assertEqual(len(tree), 1) #zjy 第一条评论应当有 1 个子评论
#zjy 渲染评论组件标签是否正常返回
data = show_comment_item(comment, True)
self.assertIsNotNone(data)
#zjy 测试工具函数获取最大文章/评论 id
s = get_max_articleid_commentid()
self.assertIsNotNone(s)
#zjy 测试发送评论邮件通知(若配置邮件服务则会成功)
from comments.utils import send_comment_email
send_comment_email(comment)
send_comment_email(comment)

@ -0,0 +1,42 @@
from django.contrib.auth.mixins import LoginRequiredMixin
from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404
from django.views.generic import View
from blog.models import Article
from .models import Comment
from .forms import CommentForm
class CommentPostView(LoginRequiredMixin, View):
"""
负责处理评论提交
"""
def post(self, request, article_id):
# 获取目标文章
article = get_object_or_404(Article, pk=article_id)
form = CommentForm(request.POST)
if form.is_valid():
# 获取评论内容
body = form.cleaned_data['body'].strip()
parent_id = form.cleaned_data.get('parent_comment_id')
comment = Comment()
comment.article = article
comment.author = request.user
comment.body = body
# 判断是否是子评论(回复)
if parent_id:
try:
parent_comment = Comment.objects.get(id=parent_id)
comment.parent_comment = parent_comment
except Comment.DoesNotExist:
pass
comment.save()
# 评论成功后返回文章页面
return HttpResponseRedirect(article.get_absolute_url())

@ -0,0 +1,69 @@
#zjy 评论模块的工具函数
#zjy 提供评论相关的辅助功能,如邮件通知
import logging
from django.utils.translation import gettext_lazy as _
from djangoblog.utils import get_current_site
from djangoblog.utils import send_email
logger = logging.getLogger(__name__)
def send_comment_email(comment):
#zjy 当用户发表评论后,给评论者发送邮件通知;
#zjy 如果该评论是回复别人的,则同时给被回复的用户发送提醒邮件。
#zjy 获取当前站点域名
site = get_current_site().domain
#zjy 邮件主题
subject = _('Thanks for your comment')
#zjy 构造文章访问 URL以便用户点进查看
article_url = f"https://{site}{comment.article.get_absolute_url()}"
#zjy 给评论者自己发送的邮件内容
html_content = _("""<p>Thank you very much for your comments on this site</p>
You can visit <a href="%(article_url)s" rel="bookmark">%(article_title)s</a>
to review your comments,
Thank you again!
<br />
If the link above cannot be opened, please copy this link to your browser.
%(article_url)s""") % {
'article_url': article_url,
'article_title': comment.article.title
}
#zjy 收件人 = 评论的作者本人
tomail = comment.author.email
#zjy 发送邮件
send_email([tomail], subject, html_content)
try:
#zjy 如果该评论存在父评论(说明是回复行为)
if comment.parent_comment:
#zjy 给被回复的人发送通知邮件
html_content = _("""Your comment on <a href="%(article_url)s" rel="bookmark">%(article_title)s</a><br/> has
received a reply. <br/> %(comment_body)s
<br/>
go check it out!
<br/>
If the link above cannot be opened, please copy this link to your browser.
%(article_url)s
""") % {
'article_url': article_url,
'article_title': comment.article.title,
'comment_body': comment.parent_comment.body
}
#zjy 父评论的作者邮箱
tomail = comment.parent_comment.author.email
#zjy 向被回复者发送邮件
send_email([tomail], subject, html_content)
except Exception as e:
#zjy 出现错误则记录日志,但不影响评论正常流程
logger.error(e)

@ -0,0 +1,44 @@
#zjy 评论模块的视图处理
#zjy 处理评论的提交和显示逻辑
from django.contrib.auth.mixins import LoginRequiredMixin
from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404
from django.views.generic import View
from blog.models import Article
from .models import Comment
from .forms import CommentForm
class CommentPostView(LoginRequiredMixin, View):
#zjy 负责处理评论提交
#zjy 使用类视图方式处理POST请求
def post(self, request, article_id):
#zjy 获取目标文章
article = get_object_or_404(Article, pk=article_id)
form = CommentForm(request.POST)
if form.is_valid():
#zjy 获取评论内容
body = form.cleaned_data['body'].strip()
parent_id = form.cleaned_data.get('parent_comment_id')
comment = Comment()
comment.article = article
comment.author = request.user
comment.body = body
#zjy 判断是否是子评论(回复)
if parent_id:
try:
parent_comment = Comment.objects.get(id=parent_id)
comment.parent_comment = parent_comment
except Comment.DoesNotExist:
pass
comment.save()
#zjy 评论成功后返回文章页面
return HttpResponseRedirect(article.get_absolute_url())

@ -1,32 +1 @@
def is_prime(n):
"""判断一个数是否为质数"""
if n <= 1:
return False
if n == 2:
return True
if n % 2 == 0:
return False
for i in range(3, int(n**0.5) + 1, 2):
if n % i == 0:
return False
return True
def print_first_n_primes(n):
"""打印前n个质数"""
count = 0
num = 2
primes = []
while count < n:
if is_prime(num):
primes.append(num)
count += 1
num += 1
# 打印结果每10个一行
for i in range(0, len(primes), 10):
print(", ".join(map(str, primes[i:i+10])))
# 输出前100位质数
print("前100位质数为:")
print_first_n_primes(100)
print("Hello World")

@ -1,5 +0,0 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/

@ -1,13 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="jdk" jdkName="Python 3.7 (Blog)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="R User Library" level="project" />
<orderEntry type="library" name="R Skeletons" level="application" />
</component>
<component name="TestRunnerService">
<option name="PROJECT_TEST_RUNNER" value="Unittests" />
</component>
</module>

@ -1,436 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DBNavigator.Project.DDLFileAttachmentManager">
<mappings />
<preferences />
</component>
<component name="DBNavigator.Project.DatabaseAssistantManager">
<assistants />
</component>
<component name="DBNavigator.Project.DatabaseFileManager">
<open-files />
</component>
<component name="DBNavigator.Project.Settings">
<connections />
<browser-settings>
<general>
<display-mode value="TABBED" />
<navigation-history-size value="100" />
<show-object-details value="false" />
<enable-sticky-paths value="true" />
<enable-quick-filters value="false" />
</general>
<filters>
<object-type-filter>
<object-type name="SCHEMA" enabled="true" />
<object-type name="USER" enabled="true" />
<object-type name="ROLE" enabled="true" />
<object-type name="PRIVILEGE" enabled="true" />
<object-type name="CHARSET" enabled="true" />
<object-type name="TABLE" enabled="true" />
<object-type name="VIEW" enabled="true" />
<object-type name="JSON_VIEW" enabled="true" />
<object-type name="MATERIALIZED_VIEW" enabled="true" />
<object-type name="NESTED_TABLE" enabled="true" />
<object-type name="COLUMN" enabled="true" />
<object-type name="INDEX" enabled="true" />
<object-type name="CONSTRAINT" enabled="true" />
<object-type name="DATASET_TRIGGER" enabled="true" />
<object-type name="DATABASE_TRIGGER" enabled="true" />
<object-type name="SYNONYM" enabled="true" />
<object-type name="SEQUENCE" enabled="true" />
<object-type name="PROCEDURE" enabled="true" />
<object-type name="FUNCTION" enabled="true" />
<object-type name="PACKAGE" enabled="true" />
<object-type name="TYPE" enabled="true" />
<object-type name="TYPE_ATTRIBUTE" enabled="true" />
<object-type name="ARGUMENT" enabled="true" />
<object-type name="JAVA_CLASS" enabled="true" />
<object-type name="JAVA_FIELD" enabled="true" />
<object-type name="JAVA_METHOD" enabled="true" />
<object-type name="JAVA_RESOURCE" enabled="true" />
<object-type name="DIMENSION" enabled="true" />
<object-type name="CLUSTER" enabled="true" />
<object-type name="DBLINK" enabled="true" />
<object-type name="CREDENTIAL" enabled="true" />
<object-type name="AI_PROFILE" enabled="true" />
</object-type-filter>
</filters>
<sorting>
<object-type name="COLUMN" sorting-type="NAME" />
<object-type name="FUNCTION" sorting-type="NAME" />
<object-type name="PROCEDURE" sorting-type="NAME" />
<object-type name="ARGUMENT" sorting-type="POSITION" />
<object-type name="TYPE ATTRIBUTE" sorting-type="POSITION" />
</sorting>
<default-editors>
<object-type name="VIEW" editor-type="SELECTION" />
<object-type name="PACKAGE" editor-type="SELECTION" />
<object-type name="TYPE" editor-type="SELECTION" />
</default-editors>
</browser-settings>
<navigation-settings>
<lookup-filters>
<lookup-objects>
<object-type name="SCHEMA" enabled="true" />
<object-type name="USER" enabled="false" />
<object-type name="ROLE" enabled="false" />
<object-type name="PRIVILEGE" enabled="false" />
<object-type name="CHARSET" enabled="false" />
<object-type name="TABLE" enabled="true" />
<object-type name="VIEW" enabled="true" />
<object-type name="JSON VIEW" enabled="true" />
<object-type name="MATERIALIZED VIEW" enabled="true" />
<object-type name="INDEX" enabled="true" />
<object-type name="CONSTRAINT" enabled="true" />
<object-type name="DATASET TRIGGER" enabled="true" />
<object-type name="DATABASE TRIGGER" enabled="true" />
<object-type name="SYNONYM" enabled="false" />
<object-type name="SEQUENCE" enabled="true" />
<object-type name="PROCEDURE" enabled="true" />
<object-type name="FUNCTION" enabled="true" />
<object-type name="PACKAGE" enabled="true" />
<object-type name="TYPE" enabled="true" />
<object-type name="JAVA CLASS" enabled="true" />
<object-type name="INNER CLASS" enabled="true" />
<object-type name="JAVA FIELD" enabled="true" />
<object-type name="JAVA METHOD" enabled="true" />
<object-type name="JAVA PARAMETER" enabled="true" />
<object-type name="JAVA RESOURCE" enabled="true" />
<object-type name="DIMENSION" enabled="false" />
<object-type name="CLUSTER" enabled="false" />
<object-type name="DBLINK" enabled="false" />
<object-type name="CREDENTIAL" enabled="false" />
</lookup-objects>
<force-database-load value="false" />
<prompt-connection-selection value="true" />
<prompt-schema-selection value="true" />
</lookup-filters>
</navigation-settings>
<dataset-grid-settings>
<general>
<enable-zooming value="true" />
<enable-column-tooltip value="true" />
</general>
<sorting>
<nulls-first value="true" />
<max-sorting-columns value="4" />
</sorting>
<audit-columns>
<column-names value="" />
<visible value="true" />
<editable value="false" />
</audit-columns>
</dataset-grid-settings>
<dataset-editor-settings>
<text-editor-popup>
<active value="false" />
<active-if-empty value="false" />
<data-length-threshold value="100" />
<popup-delay value="1000" />
</text-editor-popup>
<values-actions-popup>
<show-popup-button value="true" />
<element-count-threshold value="1000" />
<data-length-threshold value="250" />
</values-actions-popup>
<general>
<fetch-block-size value="100" />
<fetch-timeout value="30" />
<trim-whitespaces value="true" />
<convert-empty-strings-to-null value="true" />
<select-content-on-cell-edit value="true" />
<large-value-preview-active value="true" />
</general>
<filters>
<prompt-filter-dialog value="true" />
<default-filter-type value="BASIC" />
</filters>
<qualified-text-editor text-length-threshold="300">
<content-types>
<content-type name="Text" enabled="true" />
<content-type name="Properties" enabled="true" />
<content-type name="XML" enabled="true" />
<content-type name="DTD" enabled="true" />
<content-type name="HTML" enabled="true" />
<content-type name="XHTML" enabled="true" />
<content-type name="SQL" enabled="true" />
<content-type name="PL/SQL" enabled="true" />
<content-type name="JSON" enabled="true" />
<content-type name="JSON5" enabled="true" />
<content-type name="YAML" enabled="true" />
</content-types>
</qualified-text-editor>
<record-navigation>
<navigation-target value="VIEWER" />
</record-navigation>
</dataset-editor-settings>
<code-editor-settings>
<general>
<show-object-navigation-gutter value="false" />
<show-spec-declaration-navigation-gutter value="true" />
<enable-spellchecking value="true" />
<enable-reference-spellchecking value="false" />
</general>
<confirmations>
<save-changes value="false" />
<revert-changes value="true" />
<exit-on-changes value="ASK" />
</confirmations>
</code-editor-settings>
<code-completion-settings>
<filters>
<basic-filter>
<filter-element type="RESERVED_WORD" id="keyword" selected="true" />
<filter-element type="RESERVED_WORD" id="function" selected="true" />
<filter-element type="RESERVED_WORD" id="parameter" selected="true" />
<filter-element type="RESERVED_WORD" id="datatype" selected="true" />
<filter-element type="RESERVED_WORD" id="exception" selected="true" />
<filter-element type="OBJECT" id="schema" selected="true" />
<filter-element type="OBJECT" id="role" selected="true" />
<filter-element type="OBJECT" id="user" selected="true" />
<filter-element type="OBJECT" id="privilege" selected="true" />
<user-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="json view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="false" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</user-schema>
<public-schema>
<filter-element type="OBJECT" id="table" selected="false" />
<filter-element type="OBJECT" id="view" selected="false" />
<filter-element type="OBJECT" id="json view" selected="false" />
<filter-element type="OBJECT" id="materialized view" selected="false" />
<filter-element type="OBJECT" id="index" selected="false" />
<filter-element type="OBJECT" id="constraint" selected="false" />
<filter-element type="OBJECT" id="trigger" selected="false" />
<filter-element type="OBJECT" id="synonym" selected="false" />
<filter-element type="OBJECT" id="sequence" selected="false" />
<filter-element type="OBJECT" id="procedure" selected="false" />
<filter-element type="OBJECT" id="function" selected="false" />
<filter-element type="OBJECT" id="package" selected="false" />
<filter-element type="OBJECT" id="type" selected="false" />
<filter-element type="OBJECT" id="dimension" selected="false" />
<filter-element type="OBJECT" id="cluster" selected="false" />
<filter-element type="OBJECT" id="dblink" selected="false" />
</public-schema>
<any-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="json view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="true" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</any-schema>
</basic-filter>
<extended-filter>
<filter-element type="RESERVED_WORD" id="keyword" selected="true" />
<filter-element type="RESERVED_WORD" id="function" selected="true" />
<filter-element type="RESERVED_WORD" id="parameter" selected="true" />
<filter-element type="RESERVED_WORD" id="datatype" selected="true" />
<filter-element type="RESERVED_WORD" id="exception" selected="true" />
<filter-element type="OBJECT" id="schema" selected="true" />
<filter-element type="OBJECT" id="user" selected="true" />
<filter-element type="OBJECT" id="role" selected="true" />
<filter-element type="OBJECT" id="privilege" selected="true" />
<user-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="json view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="true" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</user-schema>
<public-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="json view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="true" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</public-schema>
<any-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="json view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="true" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</any-schema>
</extended-filter>
</filters>
<sorting enabled="true">
<sorting-element type="RESERVED_WORD" id="keyword" />
<sorting-element type="RESERVED_WORD" id="datatype" />
<sorting-element type="OBJECT" id="column" />
<sorting-element type="OBJECT" id="table" />
<sorting-element type="OBJECT" id="view" />
<sorting-element type="OBJECT" id="json view" />
<sorting-element type="OBJECT" id="materialized view" />
<sorting-element type="OBJECT" id="index" />
<sorting-element type="OBJECT" id="constraint" />
<sorting-element type="OBJECT" id="trigger" />
<sorting-element type="OBJECT" id="synonym" />
<sorting-element type="OBJECT" id="sequence" />
<sorting-element type="OBJECT" id="procedure" />
<sorting-element type="OBJECT" id="function" />
<sorting-element type="OBJECT" id="package" />
<sorting-element type="OBJECT" id="type" />
<sorting-element type="OBJECT" id="dimension" />
<sorting-element type="OBJECT" id="cluster" />
<sorting-element type="OBJECT" id="dblink" />
<sorting-element type="OBJECT" id="schema" />
<sorting-element type="OBJECT" id="role" />
<sorting-element type="OBJECT" id="user" />
<sorting-element type="RESERVED_WORD" id="function" />
<sorting-element type="RESERVED_WORD" id="parameter" />
</sorting>
<format>
<enforce-code-style-case value="true" />
</format>
</code-completion-settings>
<execution-engine-settings>
<statement-execution>
<fetch-block-size value="100" />
<execution-timeout value="20" />
<debug-execution-timeout value="600" />
<focus-result value="false" />
<prompt-execution value="false" />
</statement-execution>
<script-execution>
<command-line-interfaces />
<execution-timeout value="300" />
</script-execution>
<method-execution>
<execution-timeout value="30" />
<debug-execution-timeout value="600" />
<parameter-history-size value="10" />
</method-execution>
</execution-engine-settings>
<operation-settings>
<transactions>
<uncommitted-changes>
<on-project-close value="ASK" />
<on-disconnect value="ASK" />
<on-autocommit-toggle value="ASK" />
</uncommitted-changes>
<multiple-uncommitted-changes>
<on-commit value="ASK" />
<on-rollback value="ASK" />
</multiple-uncommitted-changes>
</transactions>
<session-browser>
<disconnect-session value="ASK" />
<kill-session value="ASK" />
<reload-on-filter-change value="false" />
</session-browser>
<compiler>
<compile-type value="KEEP" />
<compile-dependencies value="ASK" />
<always-show-controls value="false" />
</compiler>
</operation-settings>
<ddl-file-settings>
<extensions>
<mapping file-type-id="VIEW" extensions="vw" />
<mapping file-type-id="TRIGGER" extensions="trg" />
<mapping file-type-id="PROCEDURE" extensions="prc" />
<mapping file-type-id="FUNCTION" extensions="fnc" />
<mapping file-type-id="PACKAGE" extensions="pkg" />
<mapping file-type-id="PACKAGE_SPEC" extensions="pks" />
<mapping file-type-id="PACKAGE_BODY" extensions="pkb" />
<mapping file-type-id="TYPE" extensions="tpe" />
<mapping file-type-id="TYPE_SPEC" extensions="tps" />
<mapping file-type-id="TYPE_BODY" extensions="tpb" />
<mapping file-type-id="JAVA_SOURCE" extensions="sql" />
</extensions>
<general>
<lookup-ddl-files value="true" />
<create-ddl-files value="false" />
<synchronize-ddl-files value="true" />
<use-qualified-names value="false" />
<make-scripts-rerunnable value="true" />
</general>
</ddl-file-settings>
<assistant-settings>
<credential-settings>
<credentials />
</credential-settings>
</assistant-settings>
<general-settings>
<regional-settings>
<date-format value="MEDIUM" />
<number-format value="UNGROUPED" />
<locale value="SYSTEM_DEFAULT" />
<use-custom-formats value="false" />
</regional-settings>
<environment>
<environment-types>
<environment-type id="development" name="Development" description="Development environment" color="-2430209/-12296320" readonly-code="false" readonly-data="false" />
<environment-type id="integration" name="Integration" description="Integration environment" color="-2621494/-12163514" readonly-code="true" readonly-data="false" />
<environment-type id="production" name="Production" description="Productive environment" color="-11574/-10271420" readonly-code="true" readonly-data="true" />
<environment-type id="other" name="Other" description="" color="-1576/-10724543" readonly-code="false" readonly-data="false" />
</environment-types>
<visibility-settings>
<connection-tabs value="true" />
<dialog-headers value="true" />
<object-editor-tabs value="true" />
<script-editor-tabs value="false" />
<execution-result-tabs value="true" />
</visibility-settings>
</environment>
</general-settings>
</component>
</project>

@ -1,4 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding" addBOMForNewFiles="with NO BOM" />
</project>

@ -1,6 +0,0 @@
<component name="libraryTable">
<library name="R User Library">
<CLASSES />
<SOURCES />
</library>
</component>

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.7 (Blog)" project-jdk-type="Python SDK" />
<component name="PyCharmProfessionalAdvertiser">
<option name="shown" value="true" />
</component>
</project>

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/Blog.iml" filepath="$PROJECT_DIR$/.idea/Blog.iml" />
</modules>
</component>
</project>

@ -1,139 +0,0 @@
"""
Django settings for Blog project.
Generated by 'django-admin startproject' using Django 2.2.24.
For more information on this file, see
https://docs.djangoproject.com/en/2.2/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/2.2/ref/settings/
"""
import os
gqc
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '#rbb)%+7w3=5&kj-51b4_d#8y6$v^g9q5lgl@sb$^x*avg7is_'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
gqc# 静态文件配置
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "static").replace("\\","/"),
os.path.join(BASE_DIR, '../../static').replace('\\', '/'),
)
gqc# 图片视频资源路径配置
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media').replace("\\", "/")
MEDIA_DIRS = (
os.path.join(BASE_DIR, 'media')
)
gqc# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'HomePage',
'develop' ,
'article' ,
'DjangoUeditor',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'Blog.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': ['templates'],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'Blog.wsgi.application'
gqc# Database
# https://docs.djangoproject.com/en/2.2/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
# Password validation
# https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/2.2/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.2/howto/static-files/
STATIC_URL = '/static/'

@ -1,32 +0,0 @@
"""Blog URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/2.2/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path , re_path
from django.conf.urls import url, include
from .settings import BASE_DIR
from django.views.static import serve
from django.conf import settings
from django.conf.urls.static import static
from HomePage.views import *
urlpatterns = [
path('admin/', admin.site.urls),
path('about/', About, name='aboutsite'),
url(r'^$',include('HomePage.urls')) ,
path('develop/', include('develop.urls') ),
path('article/', include('article.urls')),
path('ueditor/', include('DjangoUeditor.urls')),
re_path(r'^media/upfile/(?P<path>.*)$', serve, {'document_root': BASE_DIR + '/media/upfile'})
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

@ -1,16 +0,0 @@
"""
WSGI config for Blog project.
It exposes the WSGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/2.2/howto/deployment/wsgi/
"""
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Blog.settings')
application = get_wsgi_application()

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save