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}'})

 

posted @ 2022-11-22 16:09  li-shu-hang  阅读(114)  评论(0)    收藏  举报