zoukankan      html  css  js  c++  java
  • Django:form.save()方法

    参考:https://blog.csdn.net/it_yuan/article/details/53580756

    背景:

      之前的博客是不支持上传文章缩略图的,后来新增了此功能,但是发现修改老的文章时,新增的图片没有上传到服务器

    仅仅是将图片的名字添加到了数据库

    原因:

      在修改的时候直接update了:

    ArticlePost.objects.filter(id=article_id).update(title=title, body=body, column_id=column_id, avatar=avatar)

    由于是使用Django的form表单传递的数据,所以要使用ModelForm.save()的方式来更新数据

    解决:

      

         article = ArticlePost.objects.get(id=article_id)
            # 从数据库先取出具体的model对象article
            # 将此model对象作为instance的参数值传入form。save(),同时还有request.POST,和request.FILES参数,
            # 这样在save的时候就会update对应的model对象
            article_post_form = ArticlePostForm(request.POST, request.FILES, instance=article)
            if article_post_form.is_valid():
                cd = article_post_form.cleaned_data
                try:
                    # 此处的save有commit=False参数,意思是只生成model对象,而不保存,生成的model对象new_article就可以修改了
                    new_article = article_post_form.save(commit=False)
                    new_article.avatar = request.FILES.get('avatar')
                    new_article.title = request.POST['title']
                    new_article.body = request.POST['body']
                    new_article.column_id = request.POST['column_id']
    
                    print('开始保存')
                    new_article.save()
                    # ArticlePost.objects.filter(id=article_id).update(title=title, body=body, column_id=column_id, avatar=avatar)
                    print('保存成功')
                    return HttpResponse('1')
                except:
                    return HttpResponse('2')

    深入分析:

      使用ModelForm.save()方法有以下几种情况:

    1、直接保存数据

      通过页面post过来的数据 form接收 直接保存到数据库,同时能够产生对应的modes的一个新对象,为什么要产生,后面讲....这个主要用来保存信息

    article_post_form = ArticlePostForm(request.POST)
    new_article
    = article_post_form.save()

    2、查看数据

      从数据库中取出modes的对象,然后通过form参数instance方法能够实例化该form,这个主要用来查看具体的信息

    article = ArticlePost.objects.get(pk=1)
    article_post_form = ArticlePostForm(instance=article)
    article_post_form.save()

    3、修改数据

      既有post又有instance,则以post为主,这个主要用来修改信息

    # 从数据库先取出具体的model对象article
    article = ArticlePost.objects.get(id=article_id)
    # 将此model对象作为instance的参数值传入form.save(),同时还有request.POST,和request.FILES参数,
    # 这样在save的时候就会update对应的model对象
    article_post_form = ArticlePostForm(request.POST, request.FILES, instance=article)
    # 此处的save有commit=False参数,意思是只生成model对象,而不保存,生成的model对象new_article就可以修改了
    new_article = article_post_form.save(commit=False)
    new_article.avatar = request.FILES.get('avatar')
    new_article.title = request.POST['title']
    new_article.body = request.POST['body']
    new_article.column_id = request.POST['column_id']
    new_article.save()
  • 相关阅读:
    hdu1238 Substrings
    CCF试题:高速公路(Targin)
    hdu 1269 迷宫城堡(Targin算法)
    hdu 1253 胜利大逃亡
    NYOJ 55 懒省事的小明
    HDU 1024 Max Sum Plus Plus
    HDU 1087 Super Jumping! Jumping! Jumping!
    HDU 1257 最少拦截系统
    HDU 1069 Monkey and Banana
    HDU 1104 Remainder
  • 原文地址:https://www.cnblogs.com/gcgc/p/10696969.html
Copyright © 2011-2022 走看看