views.py 6.0 KB

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