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