一 为文章点赞思维导图
二 修改数据模型类
class ArticlePost(models.Model):
author = models.ForeignKey(User, related_name="article")
title = models.CharField(max_length=200)
slug = models.SlugField(max_length=500)
column = models.ForeignKey(ArticleColumn, related_name="article_column")
body = models.TextField()
# 得到文章发布时的日期和时间
created = models.DateTimeField(default=timezone.now)
updated = models.DateTimeField(auto_now=True)
# 为文章点赞
users_like = models.ManyToManyField(User, related_name="articles_like", blank=True)
class Meta:
ordering = ("title",)
# 对数据库中的这两个字段建立索引,会通过每篇文章的id和slug获取该文章对象
# 这样建立索引后,能提高文章对象的速度
index_together = (('id', 'slug'),)
def __str__(self):
return self.title
# 对save方法进行重写,主要实现slugify操作
def save(self, *args, **kargs):
self.slug = slugify(self.title)
super(ArticlePost, self).save(*args, **kargs)
# 获取某篇文章对象的URL,并传递参数,由名字得到URL
def get_absolute_url(self):
return reverse("article:article_detail", args=[self.id, self.slug])
# 匹配到url(r'^list-article-detail/(?P<id>\d+)/(?P<slug>[-\w]+)/$', list_views.article_detail, name="list_article_detail"),
def get_url_path(self):
return reverse("article:list_article_detail", args=[self.id, self.slug])
数据迁移后数据库多了一张数据表
三 编写视图函数
@csrf_exempt
@require_POST
@login_required(login_url='/account/login/')
def like_article(request):
# 得到前端模板以POST方式传过来的两个值
article_id = request.POST.get("id")
action = request.POST.get("action")
if article_id and action:
try:
article = ArticlePost.objects.get(id=article_id)
if action=="like":
# 将article实例对象和user实例对象之间建立了关联,如果这一步成功了
# 数据库表article_articlepost_users_like就能够看到article和user各自的id
article.users_like.add(request.user)
return HttpResponse("1")
else:
# 数据库表article_articlepost_users_like中删除对应article和user数据
article.users_like.remove(request.user)
return HttpResponse("2")
except:
return HttpResponse("no")
四 编写URL
from django.conf.urls import url
from . import views, list_views
urlpatterns = [
url(r'^article-column/$', views.article_column, name="article_column"),
url(r'^rename-column/$', views.rename_article_column, name="rename_article_column"),
url(r'^del-column/$', views.del_article_column, name="del_article_column"),
url(r'^article-post/$', views.article_post, name="article_post"),
url(r'^article-list/$', views.article_list, name="article_list"),
url(r'^article-detail/(?P<id>\d+)/(?P<slug>[-\w]+)/$', views.article_detail, name="article_detail"),
url(r'^del-article/$', views.del_article, name="del_article"),
url(r'^redit-article/(?P<article_id>\d+)/$', views.redit_article, name="redit_article"),
url(r'^list-article-titles/$', list_views.article_titles, name="article_titles"),
# 视图函数虽然相同,但可以根据不同的视图文件来区分,但name应该不同
url(r'^list-article-detail/(?P<id>\d+)/(?P<slug>[-\w]+)/$', list_views.article_detail, name="list_article_detail"),
# 对应某个作者的全部文章
url(r'^list-article-titles/(?P<username>[-\w]+)/$', list_views.article_titles, name="author_articles"),
# 为文章点赞
url(r'^like-article/$', list_views.like_article, name="like_article"),
]