2016-06-29 4 views
0

У меня есть вид item_list_view, который отвечает на запросы GET путем визуализации шаблона, mainlist.html. Этот шаблон отображает список элементов, а также ссылки для редактирования этих пунктов:Оказание модели модели в рамках модальных ошибок обработки

#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 с ошибками в этот модальный, а не перенаправленный?


Edit: когда ссылка редактирования щелкнул эту точку зрения:

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? Первоначальный запрос GET, сделанный для '{% url items: itemform%}? I = {{item.id}}', когда щелкнула ссылку на редактирование, отвечает «return render (...)», чтобы отобразить шаблон внутри модальный с загруженным экземпляром модели. В идеале я хотел бы иметь возможность повторно отобразить тот же шаблон, когда я нахожу ошибку формы, поскольку используемый ею шаблон готов обрабатывать отображение этих ошибок. – souldeux

+0

Если вы вернете шаблон, который вам нужно предоставить, вся ваша форма находится внутри div, который должен оставаться неповрежденным - так как все модальное окно будет перезагружено. – dmitryro

+0

Я добавил некоторую информацию к моему оригинальному вопросу; представление возвращает полный шаблон формы и когда он сталкивается с недопустимым представлением. Я получаю то, что вы говорите о том, чтобы оставаться в пределах одного и того же div (концепция в любом случае), я просто подумал, что текущее представление выполнит это, поскольку оно выполняет тот же самый блок «render» как для запроса GET, так и в ответ на неверные данные формы , – souldeux