Django笔记10-文章详情页(2)

文章详情页

使用 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.pyinclude() 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  %}
    
{% csrf_token %}
{% endif %} {% if comments %} {% for comment in comments %}
user

{{ comment.user.username }} | {{ comment.create_time }}

{{ comment.body }}

{% endfor %} {% else %}

暂无评论!

{% endif %} ...

 完成后可以重启服务器进进行测试

总结

 Markdown 语法简洁易懂,普遍用于博客写作,这里也就选择让博客支持 Markdown 写作。另外还有富文本编辑器等其他功能可以选择,不需要一定是 Markdown。

 评论功能的用户关联考虑的不是很恰当,应该改为关联其他平台用户,时间不够留待下次修改。

你可能感兴趣的:(Django笔记10-文章详情页(2))