views.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. from django.shortcuts import render, redirect
  2. from django.http import HttpResponse
  3. from django.contrib.auth.models import User
  4. from django.contrib.auth.decorators import login_required
  5. from django.core.paginator import Paginator
  6. from django.db.models import Q
  7. import markdown
  8. from .models import ArticlePost, ArticleColumn
  9. from .form import ArticlePostForm
  10. from comment.models import Comment
  11. from comment.forms import CommentPost
  12. # 视图函数
  13. def article_list(request):
  14. search = request.GET.get('search')
  15. order = request.GET.get('order')
  16. tag = request.GET.get('tag')
  17. column = request.GET.get('column')
  18. article_list = ArticlePost.objects.all()
  19. # 搜索查询集
  20. if search:
  21. article_list = article_list.filter(
  22. Q(title__icontains=search) |
  23. Q(body__icontains=search)
  24. )
  25. else:
  26. search = ''
  27. # 分类查询集
  28. if column is not None and column.isdigit():
  29. article_list = article_list.filter(column=column)
  30. # 标签查询集
  31. if tag and tag != 'None':
  32. article_list = article_list.filter(tags__name__in=[tag])
  33. # 排序
  34. if order == 'total_views':
  35. article_list = article_list.order_by('-total_views')
  36. paginator = Paginator(article_list, 10)
  37. page = request.GET.get('page')
  38. articles = paginator.get_page(page)
  39. context = {'articles': articles, 'order': order, 'search': search, 'column': column, 'tag': tag, }
  40. return render(request, 'article/list.html', context)
  41. def article_detail(request, id):
  42. articles = ArticlePost.objects.get(id=id)
  43. comments = Comment.objects.filter(article=id)
  44. articles.total_views += 1
  45. articles.save(update_fields=['total_views'])
  46. md = markdown.Markdown(
  47. extensions=[
  48. 'markdown.extensions.extra',
  49. 'markdown.extensions.codehilite',
  50. 'markdown.extensions.toc'
  51. ])
  52. articles.body = md.convert(articles.body)
  53. comment_form = CommentPost()
  54. context = {'article': articles, 'toc': md.toc, 'comments': comments, 'comment_form': comment_form}
  55. return render(request, 'article/detail.html', context)
  56. @login_required(login_url='/user/login/')
  57. def article_create(request):
  58. if request.method == 'POST':
  59. article_post_form = ArticlePostForm(request.POST, request.FILES)
  60. # 判断提交的数据是否满足模型要求
  61. if article_post_form.is_valid():
  62. # 保存数据,但是暂时不提交到数据库中
  63. new_article = article_post_form.save(commit=False)
  64. new_article.author = User.objects.get(id=request.user.id)
  65. if request.POST['column'] != 'none':
  66. new_article.column = ArticleColumn.objects.get(id=request.POST['column'])
  67. # 将新文章保存到数据库中
  68. new_article.save()
  69. article_post_form.save_m2m()
  70. return redirect("article:article_list")
  71. # 如果数据不合法,返回错误信息
  72. else:
  73. return HttpResponse("表单有错误,请重新填写")
  74. # 如果用户请求获取数据
  75. else:
  76. # 创建表单类实例
  77. article_post_form = ArticlePostForm()
  78. columns = ArticleColumn.objects.all()
  79. context = {'article_post_form': article_post_form, 'columns': columns}
  80. # 返回模板
  81. return render(request, 'article/create.html', context)
  82. def article_delete(request, id):
  83. article = ArticlePost.objects.get(id=id)
  84. article.delete()
  85. return redirect("article:article_list")
  86. @login_required(login_url='/user/login/')
  87. def article_safe_delete(request, id):
  88. if request.method == 'POST':
  89. article = ArticlePost.objects.get(id=id)
  90. if article.author == User.objects.get(id=request.user.id):
  91. article.delete()
  92. return redirect("article:article_list")
  93. else:
  94. return HttpResponse("你无权限进行此操作")
  95. else:
  96. return HttpResponse("仅允许POST请求")
  97. @login_required(login_url='/user/login/')
  98. def article_update(request, id):
  99. article = ArticlePost.objects.get(id=id)
  100. if article.author == User.objects.get(id=request.user.id):
  101. if request.method == 'POST':
  102. article_post_form = ArticlePostForm(data=request.POST)
  103. if article_post_form.is_valid():
  104. article.title = request.POST['title']
  105. article.body = request.POST['body']
  106. if request.POST['column'] != 'none':
  107. article.column = ArticleColumn.objects.get(id=request.POST['column'])
  108. else:
  109. article.column = None
  110. if request.FILES.get('avatar'):
  111. article.avatar = request.FILES.get('avatar')
  112. article.tags.set(*request.POST.get('tags').split(','), clear=True)
  113. article.save()
  114. return redirect("article:article_detail", id=id)
  115. else:
  116. return HttpResponse("表单内容有误,请重新填写")
  117. else:
  118. article_post_form = ArticlePostForm()
  119. columns = ArticleColumn.objects.all()
  120. context = {'article': article, 'article_post_form': article_post_form, 'columns': columns,
  121. 'tags': ','.join([x for x in article.tags.names()])}
  122. return render(request, 'article/update.html', context)
  123. else:
  124. return HttpResponse("你无权进行此操作")