2016-08-02 53 views
0

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

这里是我的代码:

# 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. 在创建与form对象/无指定instance

  2. 在具有独立代码创建和更新,而ID是null

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

回答

2

首先需要了解几件事情。当您使用ModelForm时,您不需要手动创建/更新实例。当您致电form.save()时,您可以创建/更新。

如果您将None提供给表单的实例参数,它实际上会将当前表单视为创建表单,否则将其作为参数instance的对象上的更新表单处理。

如果您使用表单自动处理这些,您将不会有IntegrityError,因为表单将无效,错误将在form.errors中,您可以轻松地将其返回给客户端以进行通知。

这里的粗糙实现,它可能无法正常工作开箱即用,但至少应该足以引导你,你需要做什么:

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

Django的文档约ModelForm

相关问题