我的网站搭建(第36天) 统一用户管理

  • 发布时间:2016年12月5日 11:50
  • 作者:杨仕航
* 该文是基于Python2.7开发的,最新Python3.x和Django2.x视频教程可以前往 >> Django2.0视频教程

上次用UEditor富文本编辑器发表博文开发时,就发现一个问题:一开始设计Blog模型使用的作者模型单独创建了一个Author模型。具体之前的模型可看看我的网站搭建(第2天) 博客应用


这种设计会导致下面3个问题:

1)发表博客的作者无法和当前登录的账号关联(即无法和我使用的用户管理系统对接);

2)若后续开发用富文本框编辑博客时,又无法和当前登录的用户与作者关联;

3)评论发送邮件找不到作者的邮箱。

一个不好的设计会导致很多问题,需要迫切地把Blog的作者字段指向我正在使用的Django用户系统。


1、修改Blog模型作者外键关联

这个需要引入Django用户模块:

from django.contrib.auth.models import User

再修改Blog模型:

class Blog(models.Model):
    #其他字段就不罗列了,只看重点
    author=models.ForeignKey(User)

接着更新数据库:

python manage.py makemigrations
python manage.py migrate

你可以去掉Author在后台管理界面显示,修改admin.py文件即可。


2、修改对应模版

Django的User默认显示账号名,这个需要改成昵称。我把User模型的first_name当作昵称使用。只需要找到模版对应的author,修改如下:

{{blog.author.first_name}}

或使用get_full_name方法:

{{blog.author.get_full_name}}

测试一下,可以正常显示。


3、修改前面写的富文本发表博文部分代码

前面开发用富文本框发表博文中,作者字段是直接指定:

blog.author = Author.objects.all()[0]

现在就可以修改成:

blog.author = request.user

如此调整之后,博文的作者就可以有效的管理。

我们可以通过这个作者是否和当前登录的用户判断是否一致。是否允许编辑、删除等。


4、修改评论发送邮件代码

我的网站搭建(第18天) 评论或回复发送邮件通知中,给博客评论发送邮件的邮箱是固定写在settings.py文件中。

而不是直接获取博客的作者邮件。因为Author模型没有邮箱字段,所以无法处理。

使用同一套用户系统,则可以获取作者的邮箱。评论发送邮件修改代码如下,将发送邮件的代码封装成1个方法:

#coding:utf-8
#我自己写的发送邮件辅助模块,可参考 http://yshblog.com/69
from helper.email import send_email_by_template

#Blog应用和django-comments库(复制了一份到我项目中)
from apps_project.blog.models import Blog
from apps_third_party import django_comments

def send_comment_email(comment):
    #判断content_type是否是博客
    content_type = comment.content_type
    if content_type.model_class() != Blog:
        return False
    
    #获取博文
    blog = Blog.objects.get(id=content_type.id)

    email_data = {
        'comment_name' : comment.name, 
        'comment_content' : comment.comment,
        'comment_url' : u'http://yshblog.com/blog/%s#F%s' % (comment.object_pk, comment.id)}
    to_list = []

    if int(comment.root_id) == 0:
        subject = u'[杨仕航的博客]博文评论'
        template = 'email/comment.html'
        to_list.append(blog.author.email)
    else:
        subject = u'[杨仕航的博客]评论回复'
        template = 'email/reply.html'
        comment_model = django_comments.get_model()
        cams = comment_model.objects.filter(id = comment.reply_to)
        if cams:
            to_list.append(cams[0].user_email)
        else:
            #没有找到评论,就发给自己
            to_list.append(blog.author.email)

    #根据模版发送邮件
    send_email_by_template(subject, template, email_data, to_list)

在处理评论完成之后,调用该方法发送邮件即可。


血与泪的教训!在非必要的情况下,尽量使用同一套用户管理系统。

上一篇:VSTO详细打包过程

下一篇:Excel一对多查找自定义函数

相关专题: Django评论库开发   

评论列表

jzx1230

jzx1230

👍

2018-12-06 17:44 回复

新的评论

清空