2016-06-29 6 views
0

私は、テンプレートをレンダリングすることによってGETリクエストに応答するビューitem_list_viewを持っています。mainlist.html。そのテンプレートは、それらの項目を編集するためのリンクと一緒に項目のリストをレンダリング:モーダル&ハンドリングエラー内でのModelFormのレンダリング

#mainlist.html 
{% for item in items %} 
    <a class='edit-link' href='#' data-form="{% url items:itemform %}?i={{item.id}}"> 
     Edit 
    </a> 
{% endfor %} 

<!-- later in mainlist.html --> 
<div class='modal fade' tabindex="-1" role="dialog" id='itemFormModal' style='display:none;'> 
</div> 

編集リンクをクリックすると、モーダルは、対応するdata-form属性を使用してコンテンツがロードされ、その後、モーダルが示されている:

$(".edit-link").click(function(ev){ 
    ev.preventDefault(); 
    var url = $(this).data("form"); 
    $("#itemFormModal").load(url, function() { 
     $(this).modal('show'); 
    }); 
    return false; //prevent click propogation 
}); 

この時点で、モーダルは適切なModelFormで表示され、そのフォームはクラスitem-formを持ちます。私たちは、AJAXを経由してフォームを送信:

$(".item-form").on('submit', function() { 
    $.ajax({ 
     type: $(this).attr('method'), 
     url: this.action, 
     data: $(this).serialize(), 
     context: this, 
     success: function(data, status) { 
      $('#itemFormModal').html(data); 
     } 
    }); 
    return false; 
}); 

フォームが有効なデータで提出される場合、これは正常に動作します。フォームの送信が成功すると、ユーザーは成功メッセージとともにリストビューにリダイレクトされます。

フォームにエラーがある場合は、元のモーダルのエラーでフォームを再レンダリングしたいと思います。しかし、現時点でエラーが発生したフォームを送信すると、ブラウザはフォームがエラーでレンダリングされたアクションURLに直接行きます。

どのように私のModelFormをエラーでリダイレクトするのではなく、このモーダルに再ロードできますか?


編集:編集リンクは、このビューをクリックすると:

def litem_create_edit_view(request): 
    #Displays a ModelForm for an Item object 
    #if an "instance" is passed via the url, that 
    #instance is loaded into the ModelForm for editing 
    instance_id = request.GET.get('instance', None) 
    if instance_id is not None: 
     instance = Item.objects.get(id=instance_id) 
    else: 
     instance = None 

    if request.method == 'POST': 
     form = ItemForm(request.POST, instance=instance) 
     if form.is_valid(): 
      newitem = form.save() 
      messages.add_message(request, messages.SUCCESS, "Item saved!") 
      return redirect("items:mainlist") 

    else: 
     form = LeadForm(instance=instance) 

    return render(request, "leads/leadform.html", {'form':form, 'instance':instance}) 

は、モーダルの内側に、このテンプレートをレンダリングします:ビューの使用では

<div class='modal-dialog modal-lg'> 
    <div class='modal-content'> 
    {% if instance %} 
    <form method="post" class='lead-form' action="{% url 'leads:leadform' %}?instance={{instance.id}}"> 
    {% else %} 
    <form method="post" class='lead-form' action="{% url 'leads:leadform' %}"> 
    {% endif %} 
     <div class="modal-header"> 
     <button type="button" class="close" data-dismiss="modal">×</button> 
     {% if instance %} 
     <h3>Editing Item</h3> 
     {% else %} 
     <h3>Add Item</h3> 
     {% endif %} 
     </div> 
     <div class="modal-body"> 
      {% csrf_token %} 
      {{ form|crispy }} 
     </div> 
     <div class="modal-footer"> 
      <button type='submit' class='btn btn-primary'>Save</button> 
      <button type='button' class='btn btn-default' data-dismiss='modal'>Close</button> 
     </div> 
    </form> 
    </div> 
</div> 

答えて

0

のようなもの:

foos = Foo.objects.all() # or any other model data you want to return 
data = serializers.serialize('json', foos) # serialize it 

JSONを返します。ないテンプレート:

return HttpResponse(data, content_type='application/json') 

ですから、リダイレクトされることなく、同じdiv要素内にとどまるこの方法は、単にデータ が消費およびレンダリングされます。

+0

JSONではなくレンダリングされたテンプレートを返す方法はありますか?編集リンクがクリックされたときに '{%url items:itemform%}?i = {{item.id}}'に行われた最初のGETリクエストは、 'return render(...)'で応答し、正しいモデルインスタンスがロードされたモーダル理想的には、フォームエラーを表示したときに同じテンプレートを再レンダリングできるようにしたいと考えています。これは、使用するテンプレートがこれらのエラーの表示を処理する準備が整っているからです。 – souldeux

+0

フォーム全体を提供する必要がある以上にテンプレートを返す場合は、モーダルウィンドウ全体がリロードされるため、div内にそのまま残しておく必要があります。 – dmitryro

+0

元の質問に情報を追加しました。無効な送信に遭遇したときにビューは完全なフォームとテンプレートを返します。私は同じディビジョン(とにかくコンセプト)内にとどまることについてあなたが言っていることを得て、私はちょうどGETリクエストと無効なフォームデータの両方に対して同じ 'render'ブロックを実行するので、現在のビューはそれを達成すると思った。 – souldeux

関連する問題