关于本站
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 回复