V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
piaochen0
V2EX  ›  Django

关于 Django Form 和 UpdateView 配合使用的问题

  •  
  •   piaochen0 · 2019-06-26 17:24:18 +08:00 · 2977 次点击
    这是一个创建于 1975 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景简化如下:
    Model 部分:Model 名为 Task,Task 中有一个 name 字段,该字段唯一 unique=True,
    Form 部分:根据 Task 的 Model,构造了一个 ModelForm TaskForm
    View 部分,使用 CreateView,UpdateView 对此 Task 进行增加,修改。

    问题:在 UpdateView 中,因为要对前端传过来的数值进行一些加工后保存,所以重写了 form_valid 方法。在该方法中,使用 task = form.save(commit=False) 的时候,会直接触发 name 字段的唯一性验证。直接就报错跳出了。

    另外一个问题。假如我去掉 unique 验证,此时 task = form.save(commit=False)获取的 task,是不包含 id 的。我选择 save 操作,数据库里会多出一条数据。而不是在之前记录上修改的。 这里如何处理?还是需要手动指定 ID?

    django 新手。求指教。多谢。

    3 条回复    2019-06-27 09:27:58 +08:00
    asilin
        1
    asilin  
       2019-06-26 17:51:49 +08:00
    不需要 commit=False,在 save() 之前,你可以通过 form.instance 来获取 /修改表单的数据,处理完逻辑之后再 save() 即可。

    具体可以参阅: https://docs.djangoproject.com/en/1.11/topics/forms/modelforms/#s-overriding-clean-on-a-modelformset
    piaochen0
        2
    piaochen0  
    OP
       2019-06-27 09:07:55 +08:00
    @asilin 非常感谢,不过我发现一个问题,因为我的 name 字段唯一性的限制,提交表单后,该表单会验证不通过。使用 form.instance 来取值,里面的所有的字段值都是空的。必须要先表单验证通过后,才行。这种情况怎么处理呢?
    piaochen0
        3
    piaochen0  
    OP
       2019-06-27 09:27:58 +08:00
    @asilin 我已经解决了,原来是我在 ModelForm 中,没有把 id 包括在 fields 中,真的非常感谢你。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3036 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 13:09 · PVG 21:09 · LAX 05:09 · JFK 08:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.