文章详情页
使用 markdown 语法发布文章以及评论功能
Markdown 编辑器
Markdown 的语法简洁明了、学习容易,而且功能比纯文本更强,因此有很多人用它写博客。而作为一个博客网站,支持 markdown 也是必然的。
安装 markdown
# 在虚拟环境中执行
$ pip install markdown
修改视图函数
在视图中将文章内容的 markdown 语法 渲染成 HTML 文本
from markdown import markdown
...
def article(request, slug):
context = {}
article = Article.objects.get(title=slug)
# 将内容文本渲染成 HTML 文本
article.body = markdown(
article.body,
extensions = [
'markdown.extensions.extra',
'markdown.extensions.codehilite',
'markdown.extensions.toc',
]
)
context['article'] = article
if request.user.is_authenticated:
context['username']= request.user.username
return render(request, 'blog/article.html', context=context)
这里要注意,在模板文件中 {{ article.body }}
标签要修改成 {{ article.body | safe }}
,因为 django 处于安全考虑会将任何 HTML 代码进行转义。
语法高亮
当在文章中添加了一些代码实例时,根据所属语言渲染,达到高亮的效果
# 注意在虚拟环境中安装
$ pip install Pygments
安装完成之后,执行一下命令生成一个 css 文件
$ pygmentize -S default -f html -a .codehilite > code.css
把生成的 code.css
文件放入静态文件中,再在模板文件中引用
...
...
评论功能
评论功能相对独立,所以新建一个应用来完成评论功能
应用 comment
# 在 manage.py 的同级目录中执行
$ python manage.py startapp comment
在配置文件中注册 comment 应用
# fbckf/settings.py
...
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog',
'comment',
]
...
模型
评论表单内容
用户名称
文章
评论内容
创建时间
编写数据模型
# comment/models.py
from django.db import models
from django.contrib.auth.models import User
from blog.models import Article
# Create your models here.
class Comment(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
article = models.ForeignKey(Article, on_delete=models.CASCADE)
body = models.TextField()
create_time = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.body[:20]
数据库迁移
$ python manage.py makemigrations
$ python manage.py migrate
URL
# comment/urls.py
from django.urls import path
from . import views
app_name = 'comment'
urlpatterns = [
path('//', views.comment, name='comment'),
]
在 fbckf/urls.py
中 include()
comment 应用的 urls.py
文件
# fbckf/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('blog.urls')),
path('comment/', include('comment.urls')),
]
视图函数
视图函数将接受道德评论更新到数据库表中,并将新数据返回给文章页面
# comment/views.py
from django.shortcuts import render, get_object_or_404, redirect
from django.contrib.auth.models import User
from blog.models import Article
from .models import Comment
def comment(request, slug):
article = get_object_or_404(Article, title=slug)
if request.method == "POST":
username = request.POST['username']
body = request.POST['comment']
if username and body:
user = User.objects.get(username=username)
comment = Comment(user=user, article=article, body=body)
comment.save()
return redirect(article)
else:
comment = article.comment_set.all()
return render(request, 'blog/article.html', {'article':article, 'comments':comments})
return redirect(article)
get_object_or_404()
获取Article
对象 ,获取失败 返回用户 404 页面redirect()
函数 重定向到文章详情页面,但是需要修改文章数据模型
# blog/models.py
from django.urls import reverse
...
class Article(models.Model):
...
# 返回文章详情页的 url
def get_absolute_url(self):
return reverse('blog:article', kwargs={'slug':self.title})
点开文章页面是也要获取评论列表,因此也要修改 article
视图函数
# blog/views.py
...
def article(request, slug):
...
comments = article.comment_set.all()
context['comments'] = comments
...
return render(request, 'blog/article.html', context=context)
Comment 模型和 Article 模型是 ForeignKey 关联关联关系,因此使用 article.comment_set.all()
反向获取所有评论
修改模板文件
...
{% if username %}
{% endif %}
{% if comments %}
{% for comment in comments %}
暂无评论!
{% endif %}
...
完成后可以重启服务器进进行测试
总结
Markdown 语法简洁易懂,普遍用于博客写作,这里也就选择让博客支持 Markdown 写作。另外还有富文本编辑器等其他功能可以选择,不需要一定是 Markdown。
评论功能的用户关联考虑的不是很恰当,应该改为关联其他平台用户,时间不够留待下次修改。
{{ comment.user.username }} | {{ comment.create_time }}
{{ comment.body }}