django添加文章修改页面
虽然django后台管理自带的文章修改页也能用,但终归有些不顺手,于是准备自己写一个🙂
1,添加路由,会捕获article/1/change/格式的路由,其中的article_id就是文章id了
urlpatterns = [ path( r'article/<int:article_id>/change/', views.ArticleChangeView.as_view(), name='article_change'), ]
2,首先想要修改文章肯定要先把原先的内容加载出来,进入get请求后拿到article_id,
然后去数据库中查询相应的文章,article.exists()能判断是否查询出文章,若是没有,那就直接跳转新增文章页。
查出的文章数据是不能直接传,需要将其中需要的字段数据序列化成json格式,这样前端页面就能接收到这个文章数据啦。
class ArticleChangeView(View): ''' 修改文章数据 ''' # 返回编辑页面及文章数据 def get(self, request, article_id): user = request.user article = Article.objects.filter(id=article_id,author=user) if article.exists(): json_data = serializers.serialize('json', article, fields=('title','body','category','tags')) return render(request, 'blog/article_change.html',{'article_data': json_data}) return render(request, 'blog/article_add.html')
3,当然这又出现了一个问题,前端拿到json数据不能直接用django模板渲染,网上找了会发现是因为json格式中的字符串会被转义,这就需要用到safe过滤器,这样就能用js取出相应数据,然后初始化。
<script> var article_data = {{ article_data|safe }}; </script>
4,等修改完毕后,再将文章数据传回,进行修改保存。由于自己对django很多基础都不牢固,所以基本都是各种if嵌套。
这里查询分类是否存在,再保存到对应文章中,然后其中标签的多对多关系稍微麻烦一点,没找到很方便的修改方法,只好判断修改的标签若是为空,则清除文章的所有多对多关系,若是有值,则直接覆盖更新。
class ArticleChangeView(View): ''' 修改文章数据 ''' ... def post(self, request, article_id): try: user = request.user article = Article.objects.filter(id=article_id, author=user) if article.exists(): title = request.POST.get('title', '') body = request.POST.get('body', '') category = request.POST.get('category', '') tags = request.POST.get('tags', '') if category != '': article_category = Category.objects.filter(id=category) if article_category.exists(): article.update(title=title, body=body, category=category) if tags != '': tags = json.loads(tags) tags = Tag.objects.filter(id__in=tags) article[0].tags.set(tags) else: article[0].tags.clear() return JsonResponse({'state': 200,'data': '修改成功'}) return JsonResponse({'state': 400, 'data': '修改失败'}) except Exception as e: return JsonResponse({'state': 500, 'data': f'修改异常:{e}'})

浙公网安备 33010602011771号