2016-08-02 10 views
0

Djangoモデルの作成または更新に同じフォームを使用しようとしています。残念ながら、識別子がNoneの場合、他の回答で提案されているupdate_or_create()メソッドは機能しません。現在、idNoneであるかどうかをチェックしています。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) 

instanceなし/でformオブジェクトを作成するには

  1. は別の持って

  2. を指定しましたIDが作成中で更新中のコードはnull

instance=conqを指定しないと、titleが一意でなければならないため、整合性エラーが発生します。

答えて

2

最初に知っておく必要がある事項がいくつかあります。 ModelFormを使用している場合、インスタンスを手動で作成または更新することはありません。 form.save()に電話すると、作成/更新が行われます。

フォームのインスタンスパラメータにNoneを指定すると、現在のフォームが作成フォームとして実際に処理されます。それ以外の場合は、パラメータinstanceのオブジェクトの更新フォームとして処理されます。

フォームを使用してこれらを自動的に処理すると、フォームが無効でエラーがform.errorsになるため、をクライアントに返すことができます。ここで

が荒い実装だ、それは箱から出して動作しないかもしれないが、少なくとも、あなたが何をする必要があるかをご案内するために十分でなければなりません:ModelFormについて

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のドキュメント。

関連する問題