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()
  • 相关阅读:
    成都Uber优步司机奖励政策(2月18日)
    北京Uber优步司机奖励政策(2月18日)
    滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(2月18日)
    优步UBER司机全国各地最新奖励政策汇总(持续更新...)
    新年Uber司机端换新装啦!
    百度参投 Uber中国12亿美元融资已到账
    人民优步+(拼车)自动接单功能上线
    vi 调到第一行,或最后一行
    linux文本操作界面 vi面板如何复制一行
    Apache支持多端口配置处理
  • 原文地址:https://www.cnblogs.com/gcgc/p/10696969.html
Copyright © 2011-2022 走看看