views.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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
  9. from .form import ArticlePostForm
  10. from comment.models import CommentPost
  11. # 视图函数
  12. def article_list(request):
  13. search = request.GET.get('search')
  14. order = request.GET.get('order')
  15. if search:
  16. if order == 'total_views':
  17. article_list = ArticlePost.objects.filter(
  18. Q(title__icontains=search) |
  19. Q(body__icontains=search)
  20. ).order_by('-total_views')
  21. else:
  22. article_list = ArticlePost.objects.filter(
  23. Q(title__icontains=search) |
  24. Q(body__icontains=search)
  25. )
  26. else:
  27. search = ''
  28. if order == 'total_views':
  29. article_list = ArticlePost.objects.all().order_by('total_views')
  30. else:
  31. article_list = ArticlePost.objects.all()
  32. paginator = Paginator(article_list, 3)
  33. page = request.GET.get('page')
  34. articles = paginator.get_page(page)
  35. context = {'articles': articles, 'order': order, 'search': search}
  36. return render(request, 'article/list.html', context)
  37. def article_detail(request, id):
  38. articles = ArticlePost.objects.get(id=id)
  39. comments = CommentPost.objects.filter(article=id)
  40. articles.total_views += 1
  41. articles.save(update_fields=['total_views'])
  42. md = markdown.Markdown(
  43. extensions=[
  44. 'markdown.extensions.extra',
  45. 'markdown.extensions.codehilite',
  46. 'markdown.extensions.toc'
  47. ])
  48. articles.body = md.convert(articles.body)
  49. context = {'article': articles, 'toc': md.toc, 'comments': comments}
  50. return render(request, 'article/detail.html', context)
  51. @login_required(login_url='/user/login/')
  52. def article_create(request):
  53. if request.method == 'POST':
  54. article_post_form = ArticlePostForm(data=request.POST)
  55. # 判断提交的数据是否满足模型要求
  56. if article_post_form.is_valid():
  57. # 保存数据,但是暂时不提交到数据库中
  58. new_article = article_post_form.save(commit=False)
  59. new_article.author = User.objects.get(id=request.user.id)
  60. # 将新文章保存到数据库中
  61. new_article.save()
  62. return redirect("article:article_list")
  63. # 如果数据不合法,返回错误信息
  64. else:
  65. return HttpResponse("表单有错误,请重新填写")
  66. # 如果用户请求获取数据
  67. else:
  68. # 创建表单类实例
  69. article_post_form = ArticlePostForm()
  70. context = {'article_post_form': article_post_form}
  71. # 返回模板
  72. return render(request, 'article/create.html', context)
  73. def article_delete(request, id):
  74. article = ArticlePost.objects.get(id=id)
  75. article.delete()
  76. return redirect("article:article_list")
  77. @login_required(login_url='/user/login/')
  78. def article_safe_delete(request, id):
  79. if request.method == 'POST':
  80. article = ArticlePost.objects.get(id=id)
  81. if article.author == User.objects.get(id=request.user.id):
  82. article.delete()
  83. return redirect("article:article_list")
  84. else:
  85. return HttpResponse("你无权限进行此操作")
  86. else:
  87. return HttpResponse("仅允许POST请求")
  88. @login_required(login_url='/user/login/')
  89. def article_update(request, id):
  90. article = ArticlePost.objects.get(id=id)
  91. if article.author == User.objects.get(id=request.user.id):
  92. if request.method == 'POST':
  93. article_post_form = ArticlePostForm(data=request.POST)
  94. if article_post_form.is_valid():
  95. article.title = request.POST['title']
  96. article.body = request.POST['body']
  97. article.save()
  98. return redirect("article:article_detail", id=id)
  99. else:
  100. return HttpResponse("表单内容有误,请重新填写")
  101. else:
  102. article_post_form = ArticlePostForm()
  103. context = {'article': article, 'article_post_form': article_post_form}
  104. return render(request, 'article/update.html', context)
  105. else:
  106. return HttpResponse("你无权进行此操作")