123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- from django.shortcuts import render, redirect
- from django.http import HttpResponse, JsonResponse
- from django.contrib.auth.models import User
- from django.contrib.auth.decorators import login_required
- from django.core.paginator import Paginator
- from django.core import serializers
- from django.db.models import Q
- import json
- import markdown
- from .models import ArticlePost, ArticleColumn
- from .form import ArticlePostForm
- from comment.models import Comment
- from comment.forms import CommentPost
- # 视图函数
- def home(request):
- articles = ArticlePost.objects.all()[0:][:20]
- context = {'articles': articles}
- return render(request, 'article/home.html', context)
- def article_list(request):
- search = request.GET.get('search')
- order = request.GET.get('order')
- tag = request.GET.get('tag')
- column = request.GET.get('column')
- articles = ArticlePost.objects.all()
- articles, search = get_articles_ordered(articles, order, search, column, tag)
- # 分页,暂时关闭
- # paginator = Paginator(article_list, 4)
- # page = request.GET.get('page')
- articles = articles[0:][:10]
- context = {'articles': articles, 'order': order, 'search': search, 'column': column, 'tag': tag, }
- return render(request, 'article/articles.html', context)
- def get_articles_ordered(articles, order, search, column, tag):
- # 搜索查询集
- if search and search != 'None':
- articles = articles.filter(
- Q(title__icontains=search) |
- Q(body__icontains=search)
- )
- else:
- search = ''
- # 分类查询集
- if column is not None and column.isdigit():
- articles = articles.filter(column=column)
- # 标签查询集
- if tag and tag != 'None':
- articles = articles.filter(tags__name__in=[tag])
- # 排序
- if order == 'total_views':
- articles = articles.order_by('-total_views')
- return articles, search
- def callajax(request):
- if request.method == 'POST':
- response_json = request.POST
- response_json = json.dumps(response_json)
- data = json.loads(response_json)
- counter = int(data['counter'])
- articles = ArticlePost.objects.all()
- if 'articles' in data['flag']:
- search = data['search']
- column = data['column']
- tag = data['tag']
- order = data['order']
- articles, search = get_articles_ordered(articles, order, search, column, tag)
- articles = articles[counter:][:10]
- if articles:
- context = {'articles': articles}
- if 'articles' in data['flag']:
- return render(request, 'article/order_call.html', context)
- else:
- return render(request, 'article/home_call.html', context)
- else:
- return HttpResponse('已经到底了')
- else:
- return HttpResponse('What?')
- def article_detail(request, id):
- articles = ArticlePost.objects.get(id=id)
- comments = Comment.objects.filter(article=id)
- articles.total_views += 1
- articles.save(update_fields=['total_views'])
- md = markdown.Markdown(
- extensions=[
- 'markdown.extensions.extra',
- 'markdown.extensions.codehilite',
- 'markdown.extensions.toc'
- ])
- articles.body = md.convert(articles.body)
- comment_form = CommentPost()
- toc_flag = True
- if 'li' not in md.toc:
- toc_flag = False
- context = {'article': articles, 'toc': md.toc, 'comments': comments, 'comment_form': comment_form,
- 'toc_flag': toc_flag}
- return render(request, 'article/detail.html', context)
- @login_required(login_url='/user/login/')
- def article_create(request):
- if request.method == 'POST':
- article_post_form = ArticlePostForm(request.POST, request.FILES)
- # 判断提交的数据是否满足模型要求
- if article_post_form.is_valid():
- # 保存数据,但是暂时不提交到数据库中
- new_article = article_post_form.save(commit=False)
- new_article.author = User.objects.get(id=request.user.id)
- if request.POST['column'] != 'none':
- new_article.column = ArticleColumn.objects.get(id=request.POST['column'])
- # 将新文章保存到数据库中
- new_article.save()
- article_post_form.save_m2m()
- return redirect("article:article_list")
- # 如果数据不合法,返回错误信息
- else:
- return HttpResponse("表单有错误,请重新填写")
- # 如果用户请求获取数据
- else:
- # 创建表单类实例
- article_post_form = ArticlePostForm()
- columns = ArticleColumn.objects.all()
- context = {'article_post_form': article_post_form, 'columns': columns}
- # 返回模板
- return render(request, 'article/create.html', context)
- def article_delete(request, id):
- article = ArticlePost.objects.get(id=id)
- article.delete()
- return redirect("article:article_list")
- @login_required(login_url='/user/login/')
- def article_safe_delete(request, id):
- if request.method == 'POST':
- article = ArticlePost.objects.get(id=id)
- if article.author == User.objects.get(id=request.user.id):
- article.delete()
- return redirect("article:article_list")
- else:
- return HttpResponse("你无权限进行此操作")
- else:
- return HttpResponse("仅允许POST请求")
- @login_required(login_url='/user/login/')
- def article_update(request, id):
- article = ArticlePost.objects.get(id=id)
- if article.author == User.objects.get(id=request.user.id):
- if request.method == 'POST':
- article_post_form = ArticlePostForm(data=request.POST)
- if article_post_form.is_valid():
- article.title = request.POST['title']
- article.body = request.POST['body']
- if request.POST['column'] != 'none':
- article.column = ArticleColumn.objects.get(id=request.POST['column'])
- else:
- article.column = None
- if request.FILES.get('avatar'):
- article.avatar = request.FILES.get('avatar')
- article.tags.set(*request.POST.get('tags').split(','), clear=True)
- article.save()
- return redirect("article:article_detail", id=id)
- else:
- return HttpResponse("表单内容有误,请重新填写")
- else:
- article_post_form = ArticlePostForm()
- columns = ArticleColumn.objects.all()
- context = {'article': article, 'article_post_form': article_post_form, 'columns': columns,
- 'tags': ','.join([x for x in article.tags.names()])}
- return render(request, 'article/update.html', context)
- else:
- return HttpResponse("你无权进行此操作")
|