关于本站
1、基于Django+Bootstrap开发
2、主要发表本人的技术原创博客
3、本站于 2015-12-01 开始建站
上次用UEditor富文本编辑器发表博文开发时,就发现一个问题:一开始设计Blog模型使用的作者模型单独创建了一个Author模型。具体之前的模型可看看我的网站搭建(第2天) 博客应用
这种设计会导致下面3个问题:
1)发表博客的作者无法和当前登录的账号关联(即无法和我使用的用户管理系统对接);
2)若后续开发用富文本框编辑博客时,又无法和当前登录的用户与作者关联;
3)评论发送邮件找不到作者的邮箱。
一个不好的设计会导致很多问题,需要迫切地把Blog的作者字段指向我正在使用的Django用户系统。
这个需要引入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文件即可。
Django的User默认显示账号名,这个需要改成昵称。我把User模型的first_name当作昵称使用。只需要找到模版对应的author,修改如下:
{{blog.author.first_name}}或使用get_full_name方法:
{{blog.author.get_full_name}}测试一下,可以正常显示。
前面开发用富文本框发表博文中,作者字段是直接指定:
blog.author = Author.objects.all()[0]
现在就可以修改成:
blog.author = request.user
如此调整之后,博文的作者就可以有效的管理。
我们可以通过这个作者是否和当前登录的用户判断是否一致。是否允许编辑、删除等。
在我的网站搭建(第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)在处理评论完成之后,调用该方法发送邮件即可。
血与泪的教训!在非必要的情况下,尽量使用同一套用户管理系统。
相关专题: Django评论库开发
jzx1230
👍
2018-12-06 17:44 回复