您的位置:首页 > 编程语言 > Go语言

Django的博客项目创建(4)

2018-03-07 21:44 309 查看

利用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'),

]


目前效果图:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: