首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于ID字段创建或更新Django模型

基于ID字段创建或更新Django模型
EN

Stack Overflow用户
提问于 2016-08-02 17:57:31
回答 1查看 854关注 0票数 0

我试图使用相同的表单来创建或更新Django模型。不幸的是,如果标识符是None,其他答案中建议的None方法将无法工作。目前,我正在检查id是否为None,获取ModelForm,然后根据需要在单独的代码流中创建或更新对象。

这是我的代码:

代码语言:javascript
复制
# When the Conquest already exists
if c_id is not None:
    # Check if Conquest is valid, else throw error
    conq = get_object_or_404(Conquest,id=c_id)

    # Verify ModelForm data based on existing instance
    form = ConquestForm(request.POST,instance=conq)
    if not form.is_valid():
        print form.errors
        return json_response(messages='Invalid form data')

    conq.title=form.cleaned_data['title']
    conq.description=form.cleaned_data['description']
    conq.start_time=form.cleaned_data['start_time']
    conq.end_time=form.cleaned_data['end_time']
    conq.save()
    return JsonResponse({'success':'true','message':'Conquest updated'},status=200)

else:
    # Verify ModelForm data based
    form = ConquestForm(request.POST)    
    if not form.is_valid():
        print form.errors
        return json_response(messages='Invalid form data')

    conq = Conquest.objects.create(
            title=form.cleaned_data['title'], 
            description=form.cleaned_data['description'],
            start_time=form.cleaned_data['start_time'],
            end_time=form.cleaned_data['end_time'])

    return JsonResponse({'success':'true','message':'Conquest created'},status=200)

如何避免代码重复:

  1. 在创建带有/不指定instanceinstance对象时
  2. 具有创建和更新id为null的单独代码。

如果不指定instance=conq,则会收到完整性错误,因为title必须是唯一的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-02 18:10:25

有几件事你需要首先知道。在使用ModelForm时,不手动创建/更新实例。您在调用form.save()时确实会创建/更新。

如果您向表单的实例参数提供了一个None,它实际上会将当前表单视为一个创建表单,否则它将它视为参数instance的对象上的一个更新表单。

如果您使用表单自动处理这些,您将不会拥有IntegrityError,因为表单将是无效的,并且错误将出现在form.errors中,您可以很容易地将其返回客户端以进行通知。

下面是一个粗略的实现,它可能不会成功,但至少应该足够指导您所需要做的事情:

代码语言:javascript
复制
def func(request, c_id):
    if c_id:
        conq = get_object_or_404(Conquest, id=c_id)
    else:
        conq = None

    form = ConquestForm(request.POST or None, instance=conq)
    if form.is_valid():
        # this could either be a creation or an update
        conquest = form.save()
        return JsonResponse({'success': true})
    else:
        errors = form.errors
        return JsonReponse({'success':false, 'errors': errors})

关于ModelForm的Django文档。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38727419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档