后台管理
本功能需求:
-展示登录用户的所有文章
-文章新增(防止xss攻击)
-文章新增时支持上传图片
拓展需求:
-修改个人信息(包括头像,密码,站点背景)
-使用md编辑器上传文章
-文章编辑
-文章删除
一、添加路由
后台管理urls.py
path('backend/', views.backend, name='backend')
后台添加文章 urls.py
path('add_article/', views.add_article, name='add_article')
文本编辑器上传图片 urls.py
path('upload_img/', views.upload_img, name='upload_img')
二、添加视图函数
在views.py中添加
后台管理 视图函数 backend
def backend(request):
article_num = models.Article.objects.filter(blog=request.user.blog).count()
category_num = models.Category.objects.filter(blog=request.user.blog).count()
tag_num = models.Tag.objects.filter(blog=request.user.blog).count()
article_list = models.Article.objects.filter(blog=request.user.blog)
page_num_int = int(request.GET.get('page', 1))
paginator = Paginator(article_list, 10)
if paginator.num_pages > 9:
if page_num_int - 4 < 1:
page_range = range(1, 9)
elif page_num_int + 4 > paginator.num_pages:
page_range = range(paginator.num_pages - 8, paginator.num_pages + 1)
else:
page_range = range(page_num_int - 4, page_num_int + 4)
else:
page_range = paginator.page_range
page = paginator.page(page_num_int)
category_list = models.Category.objects.filter(blog=request.user.blog)
tag_list = models.Tag.objects.filter(blog=request.user.blog)
start = 1
end = paginator.num_pages
blog = request.user.blog
category_list = models.Category.objects.filter(blog=blog)
tag_list = models.Tag.objects.filter(blog=blog)
return render(request, 'user/Backend.html', locals())
后台添加文章 视图函数add_article
@login_required(login_url='/login/')
def add_article(request):
res = {'code': 100, 'msg': '发布成功'}
if request.method == 'POST':
title = request.POST.get('title')
content = request.POST.get('html_doc')
markdown = request.POST.get('mark_doc')
category = request.POST.get('category')
tags = request.POST.get('tags')
head_img = request.FILES.get('head_img')
tags1 = tags.split(',')
soup = BeautifulSoup(content, 'html.parser')
description = soup.text[0:120]
res_script = soup.find_all('script')
for script in res_script:
script.decompose()
article = models.Article.objects.create(
title=title,
blog=request.user.blog,
description=description,
content=str(soup),
markdown=markdown,
category_id=category,
head_img=head_img
)
ll = []
for tag in tags1:
ll.append(models.Tag2Article(article_id=article.pk, tag_id=tag))
models.Tag2Article.objects.bulk_create(ll)
return JsonResponse(res)
上传图片视图函数 upload_img(使用md编辑器)
@login_required(login_url='/login/')
def upload_img(request):
img_obj = request.FILES.get('editormd-image-file')
img = Image.open(img_obj)
uid = ''.join(str(uuid.uuid4()).split('-'))[::4]
tmp = img_obj.name.rsplit('.', 1)[-1]
t = str(time.time()).split('.')
img_name = ''.join([t[0], t[-1], '_', uid, '.', tmp])
img.save('media/article_img/' + img_name)
return JsonResponse({'success': 1, 'msg': '上传成功', 'url': f"/media/article_img/{img_name}"})
三、后台管理功能涉及的模型层操作
后台管理主要是涉及添加文章,以及上传文章中的图片,所以主要操作文章表Article
后台管理功能还涉及到修改用户的个人信息,所以也会操作UserInfo表
四、后台管理前端模板
后台管理页面前端
在templates文件夹中的user文件夹中新建Backend.html(也要继承基础模板base.html)