利用Django实现的功能如下:
- Post模型优化
- 增加类别显示功能
- 增加新的应用comments
具体实现过程如下:
1.模型优化,Post模型增加阅读量自动加1的功能:
在模型中增加increase_views方法:
class Post(models.Model):
...
def increase_views(self):
self.views += 1
#只更新views字段,提高效率。
self.save(update_fields=['views'])
在视图函数中修改阅读量加1的功能实现:
def detail(request, pk):
post = get_object_or_404(Post,pk=pk)
#调用post对象方法,阅读量加1
post.increase_views()
...
2.增加类别显示功能:
在视图函数中增加category模板渲染:
def category(request, pk):
post_list = Post.objects.filter(category_id=pk).order_by('-created_time')
return render(request, 'blog/index.html', context={'post_list':post_list})
在模板中增加category的url生成功能:
<div class="widget widget-category">
<h3 class="widget-title">分类</h3>
{% get_categories as category_list %}
<ul>
{% for category in category_list %}
<li>
<a href="{% url 'blog:category' category.pk %}">{{ category.name }} <span
class="post-count">(13)</span></a>
</li>
在urls.py文件中增加category的url:
url(r'^category/(?P<pk>[0-9]+)/$', views.category,name='category'),
3.增加comments应用:
创建新应用comments:
python install startapp comments
创建comments模型:
与Post是外键连接关系
from django.db import models
# Create your models here.
class Comment(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField(max_length=225)
url = models.URLField(blank=True,null=True)
text = models.TextField()
created_time = models.DateTimeField(auto_now_add=True)
modified_time = models.DateTimeField(auto_now=True)
#需要外键连接到blogapp中的Post模型
post = models.ForeignKey('blogapp.Post', on_delete=models.CASCADE)
def __str__(self):
#后台显示的是评论的前20个字符
return self.text[:20]
在settings中安装该app:
INSTALLED_APPS = [
...
'django.contrib.staticfiles',
'blogapp.apps.BlogappConfig',
'comments.apps.CommentsConfig',
]
创建表单froms.py:
from django import forms
from .models import Comment
class CommentForm(forms.ModelForm):
class Meta:
model = Comment
fields = ['name', 'email', 'url', 'text']
增添跨域请求保护功能:
在模板中设置detail.html
<section class="comment-area" id="comment-area">
<hr>
<h3>发表评论</h3>
<form action="{% url 'comments:post_comment' post.pk %}" method="post" class="comment-form">
{% csrf_token %}
<div class="row">
<div class="col-md-4">
<label for="{{ form.name.id_for_label }}">名字:</label>
{{ form.name }}
{{ form.name.errors }}
</div>
<div class="col-md-4">
<label for="{{ form.email.id_for_label }}">邮箱:</label>
{{ form.email }}
{{ form.email.errors }}
</div>
<div class="col-md-4">
<label for="{{ form.url.id_for_label }}">URL:</label>
{{ form.url }}
{{ form.url.errors }}
</div>
<div class="col-md-12">
<label for="{{ form.text.id_for_label }}">评论:</label>
{{ form.text }}
{{ form.text.errors }}
<button type="submit" class="comment-btn">发表</button>
</div>
</div> <!-- row -->
</form>
...
</section>
创建评论显示视图函数:
from django.shortcuts import render,get_object_or_404,redirect
# Create your views here.
from blogapp.models import Post
from .models import Comment
from .forms import CommentForm
def post_comment(request,post_pk):
post = get_object_or_404(Post,pk=post_pk)
if request.method == 'POST':
#接受request中传入的POST数据,用于创建表单
form = CommentForm(request.POST)
if form.is_valid():
#存到内存,不存到数据库
comment = form.save(commit=False)
comment.post = post
comment.save()
#重定向到帖子对象
return redirect(post)
#重新渲染原网页
else:
comment_list = post.comment_set.all()
context = {
'post':post,
'form':form,
'comment_list':
comment_list
}
return render(request, 'blog/detail.html',context=context)
#redirecth函数,当传入对象时,它会调用对象的get_absolute_url函数,反向生成url
return redirect(post)
创建评论显示urls:
from django.conf.urls import url
from . import views
app_name = 'comments'
urlpatterns = [
url(r'^comment/post/(?P<post_pk>[0-9]+)/$', views.post_comment, name='post_comment'),
]
添加comment.urls到根urls中:
urlpatterns = [
...
url(r'^archives/(?P<year>[0-9]{4})/(?P<month>[0-9]{1,2})/$', views.archives, name='archives'),
url(r'^category/(?P<pk>[0-9]+)/$', views.category,name='category'),
]
目前效果图: