一、添加评论
原来的django是自带这个django-contrib-comments的,不过Django 1.6之后,它就分离开了。
1.安装
pip install django-contrib-comments -i http://pypi.douban.com/simple/
[/pho]
2.在配置 settings.py 中加入:
INSTALLED_APPS = [
...
'django.contrib.sites',
'django_comments',
]
SITE_ID = 1
3.执行migrate
python manage.py makemigrations python manage.py migrate
4.在 urls.py 中加入路由规则(是在项目目录下的url,不是app下面的url)。
path('comments/', include('django_comments.urls')),
5.views中使用
def display_topic(request, topic_id):
topic = Topic.objects.get(id=topic_id)
return render_to_response('topic.html', {'topic': topic},
RequestContext(request))
6.模板中使用
{% load comments %}
{% get_comment_form for topic as form %}
<form action="{% comment_form_target %}" method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Comment" />
</form>
备注:
如果copy项目原来的代码不可用,可以使用上面的代码进行测试。
效果预览:

7.解决bug
其实到这里就已经Ok了,不过我测试的时候无法发表评论,后来经过仔细排查,发现原来自己的url配置有问题,访问http://127.0.0.1:8000/^comments/posted/的时候匹配到其他网址去了。
后来直接写成:
urlpatterns = [
path(r'^comments/', include('django_comments.urls')),
path('', include('weather.urls')),
path('admin/', admin.site.urls),
]
这样的形式,问题解决。
发布成功的评论在django_comments这个表中:

8.展示评论
<div class = "well">
{% get_comment_list for topic as comment_list %}
{% for comment in comment_list %}
<p>Posted by: {{ comment.user_name }} on {{ comment.submit_date }}</p>
<p>{{ comment.comment }}</p>
{% endfor %}
</div>
参考:
https://github.com/xiaosongshine/djangoWebs
https://mozillazg.com/2013/01/django-built-in-comments-framework.html
http://www.hongweipeng.com/index.php/archives/1904/
二、添加新的app
1.python manage.py startapp appname
2.在settins.py中添加
3.运行migrate
4.在app的admin中添加后台管理代码
5.就可以在后台使用了。

三、使用UEditorField
1.下载DjangoUeditor
python3: https://github.com/twz915/DjangoUeditor3/ (直接下载zip)
2.将DjangoUeditor放到项目的根目录下面。
3.在settings.py中添加app
'DjangoUeditor',
4.配置url
path(r'ueditor/', include('DjangoUeditor.urls')),
参考:
https://www.jianshu.com/p/d236a33a8c01
https://blog.csdn.net/Mr_Sunqq/article/details/80041435
四、文章标签
models
#文章标签
class Tag(models.Model):
name = models.CharField('文章标签',max_length=100)
class Meta:
verbose_name = '文章标签'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class Article(models.Model):
title = models.CharField('标题', max_length=70)
excerpt = models.TextField('摘要', max_length=200, blank=True)
category = models.ForeignKey(Category, on_delete=models.DO_NOTHING, verbose_name='分类', blank=True, null=True)
#使用外键关联分类表与分类是一对多关系
tags = models.ManyToManyField(Tag,verbose_name='标签', blank=True)
使用方法:
#内容页
def details(request,did):
show = Article.objects.get(id=did)#查询指定ID的文章
tags = ','.join([i.name for i in show.tags.all()])
previous_blog = Article.objects.filter(created_time__gt=show.created_time,category=show.category.id).first()
netx_blog = Article.objects.filter(created_time__lt=show.created_time,category=show.category.id).last()
show.views = show.views + 1
show.save()
return render(request, 'blog/details.html', locals())