Django在OS X下的编程实战(三)-构建博客的高级功能

原创 2016年08月29日 20:33:42

在之前的两篇文章Django在OS X下的编程实战(一)构建一个博客系统Django在OS X下的编程实战(二)操作博客数据模型主要利用Django的应用模版很快的构建了一个博客系统,大部分都是使用的模版内生的功能。这一篇主要开始大规模定制模版,实现更高级和定制化的功能。

使用电子邮件分享博客文章。

根据各种博客的共同特征,这个功能要实现包涵了:

创建一个动作入口,一个超链接去进入表单

创建一个表单用来填写共享帖子和邮件相关信息,表单提交完成分享


接下来分解每一步:

1. 创建表单form.py

from django import forms

class EmailPostForm(forms.Form):
     name = forms.CharField(max_length=25)
     email = forms.EmailField()
     to = forms.Emailfield()
     comments = forms.CharField(required=False,widget=forms.Textarea)

2. 在view.py里面处理表单响应

From .forms import EmailPostForm

def post_share(request,post_id):
     post = get_object_or_404(Post,id=post_id,status='published')
     if request.method == 'POST':
          form = EmailPostForm(request.POST)
          if form.is_valid():
               cd = form.cleaned_data
     else:
          form = EmailPostForm()
     return render(request, 'blog/post/share.html', {'post':post,'form':form})

3. 发送邮件功能使用python的邮件库,把下面代码增加到view.py里面。

from django.core.mail import send_mail
send_mail('Django mail','This email was sent with Django.','admin@test.com',['admin@test.com'],fail_silently=False)
因此,view.py看上去像下面

from .forms import EmailPostForm
from django.core.mail import send_mail

def post_share(request,post_id):
     post = get_object_or_404(Post,id=post_id,status='published')
     sent = False
     if request.method == 'POST':
          form = EmailPostForm(request.POST)
          if form.is_valid():
               cd = form.cleaned_data
               post_url = request.build_absolute_uri(post.get_absolute_url())
               subject = '{} ({}) recommends you reading "{}"'.format(cd['name'],cd['email'],post.title)
               message = 'Read "{}" at {}\n\n{}\'s comments:{}'.format(post.title,post_url,cd['name'],cd['comments'])
               send_mail(subject,message,'admin@test.com',[cd['to']])
               sent = True
     else:
          form = EmailPostForm()
     return render(request, 'blog/post/share.html', {'post':post,'form':form,'sent':sent})

4. 最后输出显示模版如下

{% extends "blog/base.html" %}
{% block title %}Share a post{% endblock%}
{% block content%}
{% if sent %}
<h1>Email sent successfully.</h1>
<p>
"{{post.title}}" was successfully sent to {{cd.to}}.
</p>
{% else %}
<h1>Share "{{post.title}}" by email</h1>
<form action="." method='post">
{{form.as_p}}
{% csrf_token %}
<input type="submit" value="Send email">
</form>
{% endif %}
{% endblock %}

创建评论系统

这个功能和用邮件共享帖子是一样的,也是需要表单,响应和显示。唯一多出来的是评论和帖子是不同的数据模型。

1. 在models.py创建评论模型

class Comment(models.Model):
     post = models.ForeignKey(Post, related_name='comments')
     name = models.CharField(max_length=80)
     email = models.EmailField()
     body = models.TextField()
     created = models.DateTimeField(auto_now_add=True)
     updated = models.DateTimeField(auto_now=True)
     active = models.BooleanField(default=True)

     class Meta:
          ordering = ('created',)

     def __str__(self):
          return 'Comment by {} on {}'.format(self.name,self.post))

2. 创建的数据模型同步到数据库

python manage.py makemigrations blog
python manage.py migrate

3. 把数据模型挂在站点admin.py上面去。

from .models import Post, Comment

class CommentAdmin(admin.ModelAdmin):
     list_display = ('name','email','post','created','active')
     list_filter = ('active','created','updated')
     search_fileds=('name','email','body')
admin.site.register(Comment, CommentAdmin)

4. 在forms.py创建表单,并且在models.py里面响应事件

from .models import Comment

class CommentForm(forms.ModelForm):
     class Meta:
          model = Comment
          fields=('name','email','body')

from .models import Post, Comment
from .models import EmailPostForm, CommentForm

def post_detail(request,year,month,day,post):
     post = get_object_or_404(Post, slug=post,status='published',publish_year=year,publish_month=month,publish_day=day)
     comments = post.comments.filter(active=True)

     if request.method == 'POST':
          comment_form = CommentForm(data=request.POST)
          if comment_form.is_valid():
               new_comment = comment_form.save(commit=False)
               new_comment.post = post
               new_comment.save()
          else:
               comment_form = CommentForm()
          return render(request,'blog/post/detail.html',{'post':post,'comments':comments,'comment_form':comment_form})

5. 最后也是需要调整view的显示模版,在post_detail.html里面增加评论列表。这一部分代码我就不贴了。

最后一个功能,就是给帖子打标签,这一部分,我略过,有兴趣的找django-taggit的文档来看。总归一句话,别再想着写代码了,你想写的,都被人写完了,你想着怎么整合拼装就好了,除非你要做底层的程序员。



版权声明:本文为博主原创文章,你想转就转,反正我也拦不住。

Django在OS X下的编程实战(四)-构建社交网站

Django的优势在于构建很多整套应用的数据模型,显示模版和响应事件能力,这一次我们来体会一下社交网站。 如果大家看了之前的文章,就知道我们需要通过虾面的命令创建一个社交网站项目。在setting...
  • winnerineast
  • winnerineast
  • 2016年08月31日 13:35
  • 334

Django在OS X下的编程实战(一)构建一个博客系统

废话少说,直奔主题,你要做事之前需要有一台电脑,最好是Linux或者OS X,因为我在Macbook pro下工作,所以至少这里的命令都在OS X下运行通过的。所有代码都是单独一行方便你拷贝。Pyth...
  • winnerineast
  • winnerineast
  • 2016年08月25日 15:09
  • 755

java并发编程实战-构建自定义的同步工具

1,状态依赖性的管理:在单线程程序中,如果某一个基于状态的前提条件未得到满足,则这个条件将永远无法成真,可是,在并发程序中,基于状态的条件可能由于其他线程的操作而改变 2,条件队列:他使得一组线程能够...
  • tidu2chengfo
  • tidu2chengfo
  • 2017年07月23日 16:21
  • 90

Windows下进行Django开发

参考网址:http://www.cnblogs.com/hongten/p/hongten_django_install.html 依赖:win + python2.7环境。第一步:安装官方下载Dj...
  • u012969412
  • u012969412
  • 2017年08月15日 19:23
  • 177

Django在OS X下的编程实战(二)操作博客数据模型

第一篇最后想略过的部分,被很多人追着问,我反复解释还不如写出来。顺着上次的博客系统和数据模型继续写。这一篇的主题就是针对数据模型进行操作。...
  • winnerineast
  • winnerineast
  • 2016年08月26日 21:12
  • 739

如何使用 Docker 组件开发 Django 项目?

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。自2013年发布以来,无论是从 Githu...
  • wangpeng198688
  • wangpeng198688
  • 2015年07月15日 15:01
  • 828

Python Django进阶教程(三)(模型的高级用法)

Django版本:1.11 操作系统:Windows Python:3.5数据模型高级使用。这节主要讲模型的使用。回顾一下基础教程的模型设计 新建了三个表,分别Publisher,A...
  • HuangZhang_123
  • HuangZhang_123
  • 2017年05月11日 12:03
  • 1259

Shell编程实战

# 隔一秒检查MySQL在执行的DML语句 while true; do sudo mysql --default-character-set=utf8 -h ${host} -P 3306 ...
  • BigBigWorld_
  • BigBigWorld_
  • 2017年04月04日 14:48
  • 249

mac NSCollectionView

在写这篇NSCollectionView的时候,前面已经写了一篇关于NSTableView的文章。感觉在做NSCollectionView的时候还是不能很好地做出来。庆幸的是通过各种手段总于把NSCo...
  • tongwei117
  • tongwei117
  • 2017年05月12日 09:44
  • 204

《java并发编程实战》基础构建模块(一)

同步容器类包括Vector和Hashtable,与之对应的非同步的容器是
  • u200814499
  • u200814499
  • 2014年11月10日 10:25
  • 776
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Django在OS X下的编程实战(三)-构建博客的高级功能
举报原因:
原因补充:

(最多只允许输入30个字)