Django个人博客搭建1-创建Django项目和第一个App
Django个人博客搭建2-编写文章Model模型,View视图
Django个人博客搭建3-创建superuser并向数据库中添加数据并改写视图
Django个人博客搭建4-配置使用 Bootstrap 4 改写模板文件
Django个人博客搭建5-编写文章详情页面并支持markdown语法
Django个人博客搭建6-对文章进行增删查改
Django个人博客搭建7-对用户登陆注册等需求的实现
Django个人博客搭建8-优化文章模块
Django个人博客搭建9-增加文章评论模块
1.增加文章评论模块
首先在命令行中新建评论app:
python manage.py startapp comment
然后在settiings.py中注册comment模块
INSTALLED_APPS = [
'django.contrib.admin',
...
'comment',
]
然后修改my_blog/urls.py中注册根路由:
...
path('comment/', include('comment.urls', namespace='comment')),
...
在comment文件夹下新建urls.py编写如下代码:
app_name = 'comments'
urlpatterns = [
]
接下来编写评论的模型comment/models:
from django.contrib.auth.models import User
from django.db import models
# Create your models here.
from article.models import ArticlePost
class Comment(models.Model):
article = models.ForeignKey(
ArticlePost,
on_delete=models.CASCADE,
related_name='comments',
)
user = models.ForeignKey(
User,
on_delete=models.CASCADE,
related_name='comments',
)
body = models.TextField()
created = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ('created',)
def __str__(self):
return self.body[:20]
模型的两个外键分别是被评论的文章和评论发布者
接着我们进行数据迁移:
F:\Desktop\myblog>python manage.py makemigrations
System check identified some issues:
WARNINGS:
article.ArticlePost.created: (fields.W161) Fixed default value provided.
HINT: It seems you set a fixed date / time / datetime value as default for this field. This may not be what you want. If you want to have the current date as default, use `django.utils.timezone.now`
Migrations for 'article':
article\migrations\0004_auto_20190212_1049.py
- Alter field created on articlepost
Migrations for 'comment':
comment\migrations\0001_initial.py
- Create model Comment
F:\Desktop\myblog>
F:\Desktop\myblog>python manage.py migrate
System check identified some issues:
WARNINGS:
article.ArticlePost.created: (fields.W161) Fixed default value provided.
HINT: It seems you set a fixed date / time / datetime value as default for this field. This may not be what you want. If you want to have the current date as default, use `django.utils.timezone.now`
Operations to perform:
Apply all migrations: admin, article, auth, comment, contenttypes, sessions, userprofile
Running migrations:
Applying article.0004_auto_20190212_1049... OK
Applying comment.0001_initial... OK
F:\Desktop\myblog>
用户提交评论时会用到表单,因此新建表单类comment/forms.py
from django import forms
from comment.models import Comment
class CommentForm(forms.ModelForm):
class Meta:
model = Comment
fields = ['body']
评论的两个外键通过视图逻辑自动填写,所以这里只需要提交body就可以了
接下来修改comment/urls.py
from django.urls import path
from . import views
app_name = 'comments'
urlpatterns = [
path('post-comment/<int:article_id>/', views.post_comment, name='post_comment'),
]
接下来在comment/views.py中新增post_comment视图:
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse
from django.shortcuts import render, get_object_or_404, redirect
# Create your views here.
from article.models import ArticlePost
from comment.forms import CommentForm
@login_required(login_url='/userprofile/login/')
def post_comment(request, article_id):
article = get_object_or_404(ArticlePost, id=article_id)
# 处理POST请求
if request.method == 'POST':
comment_form = CommentForm(request.POST)
if comment_form.is_valid():
new_comment = comment_form.save(commit=False)
new_comment.article = article
new_comment.user = request.user
new_comment.save()
return redirect(article)
else:
return HttpResponse('表单内容有误,请重新填写')
else:
return HttpResponse("发表评论仅接受post请求")
get_object_or_404作用时用户请求一个不存在的对象时会返回ERROR404
redirect:返回到一个适合的url中:即用户发送评论后,重新定向到文章详情页面.当其参数是一个Model对象时,会自动调用这个Model对象的get_absolute_url()方法。因此接下来马上修改article(article/models.py)的模型。
# 博客文章数据模型
class ArticlePost(models.Model):
...
def get_absolute_url(self):
return reverse('article:article_detail', args=[self.id])
通过reverse方法返回文章详情页面的url,实现了路由的重定向
接下来因为评论也需要咋i文章详情页面展示,所以必须把评论模块的上下文也传递到模板中
修改article/views.py中的article_detail:
# 文章详情
def article_detail(request, id):
...
comments = Comment.objects.filter(article=id)
...
context = {'article': article, 'toc': md.toc, 'comments': comments}
# 载入模板,并返回context对象p
return render(request, 'article/detail.html', context)
很简单就是取出对应文章的所有评论( filter() 可以取出多个满足条件的对象,而 get() 只能取出1个)
最后一步修改文章详情页面templates/article.detail.html:
...
<div>
浏览量:{{ article.total_views }}
</div>
<div class="col-12">
<p>{{ article.body|safe }}</p>
</div>
<!-- 发表评论 -->
<hr>
{% if user.is_authenticated %}
<div>
<form action="{% url 'comment:post_comment' article.id %}"
method="post">
{% csrf_token %}
<div class="form-group">
<label for="body">
<strong>
我也要发言:
</strong>
</label>
<textarea type="text" class="form-control" id="body" name="body" rows="2"></textarea>
</div>
<button type="submit" class="btn btn-primary">发送</button>
</form>
</div>
<br>
{% else %}
<br>
<h5 class="row justify-content-center">
请<a href="{% url 'userprofile:login' %}">登录</a>后回复
</h5>
<br>
{% endif%}
<!-- 显示评论 -->
<h4>
共有{{ comments.count }}条评论
</h4>
<div>
{% for comment in comments %}
<hr>
<p>
<strong style="color: pink">
{{ comment.user }}
</strong>于
<span style="color: green">
{{ comment.created|date:"Y-m-d H:i:s" }}
</span>时说:
</p>
<pre style="font-family: inherit; font-size: 1em;white-space: pre-wrap;word-wrap: break-word;"> {{ comment.body }}
</pre>
{% endfor %}
</div>
</div>
{# 目录 #}
<div class="col-3 mt-4">
...
我们在pre style中添加的**white-space: pre-wrap;word-wrap: break-word;**时为了让评论过长时自动换行,不会出现滚动条.
我们重启服务器并评论查看效果
我们可以看到评论过长时也不会出现不美观的现象或者影响观看了
可以看奥评论功能已经可以正常使用了,退出登陆后:
这样文章评论模块就已经全部完成了
Django个人博客搭建1-创建Django项目和第一个App
Django个人博客搭建2-编写文章Model模型,View视图
Django个人博客搭建3-创建superuser并向数据库中添加数据并改写视图
Django个人博客搭建4-配置使用 Bootstrap 4 改写模板文件
Django个人博客搭建5-编写文章详情页面并支持markdown语法
Django个人博客搭建6-对文章进行增删查改
Django个人博客搭建7-对用户登陆注册等需求的实现
Django个人博客搭建8-优化文章模块
Django个人博客搭建9-增加文章评论模块