Django - Как показывать сообщения в функции ajax
Я использую плагин AjaxForm для отправки моей формы без обновления. как:
$('#my_form_id').ajaxForm(function(){
//something on success or fail
});
это работает правильно. когда я нажимаю кнопку "Отправить", он сохраняет данные формы без обновления. Но до этого; У меня были сообщения django в моем файле шаблона, например:
{% for message in messages %}
<div id="notice" align="center">
{{ message }}
</div>
{% endfor %}
что делает этот код, это отображение уведомлений, если пост сохранен правильно или что-то не удалось.
в настоящее время; Я не могу этого сделать. Я не понимаю, как я могу использовать эти теги сообщений с помощью функций ajax.
он просто сохраняет сообщение. нет уведомлений.
спасибо.
изменить:
add_post url: url(r'^admin/post/add/$', view='add_post',name='add_post'),
связанный вид:
@login_required(login_url='/login/')
def add_post(request):
template_name = 'add.html'
owner = request.user
if request.method == "POST":
form = addForm(request.POST)
if form.is_valid():
titleform = form.cleaned_data['title']
bodyform = form.cleaned_data['body']
checkform = form.cleaned_data['isdraft']
n = Post(title=titleform, body=bodyform, isdraft=checkform, owner=owner)
n.save()
messages.add_message(request, messages.SUCCESS,
'New post created successfully!')
else:
messages.add_message(request, messages.WARNING,
'Please fill in all fields!')
else:
form = addForm()
return render_to_response(template_name, {'form': form, 'owner': owner,},
context_instance=RequestContext(request))
Ответы
Ответ 1
Это инструменты/методы, которые помогли мне решить проблему. Во-первых, у меня есть вспомогательный метод помощи render_to_json
:
# `data` is a python dictionary
def render_to_json(request, data):
return HttpResponse(
json.dumps(data, ensure_ascii=False),
mimetype=request.is_ajax() and "application/json" or "text/html"
)
У меня есть шаблон messages.html
, чтобы отобразить необходимый html для всплывающих сообщений:
{% for message in messages %}
<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
{% endfor %}
При создании сообщения в ответ на запрос AJAX я использую Django render_to_string
для упаковки сообщений (ов) в строку, которая хранится в словаре data
, который затем использует мой render_to_json
для возврата соответствующий ответ:
def my_custom_view(request)
# ... your view code
data = {
'msg': render_to_string('messages.html', {}, RequestContext(request)),
}
return render_to_json(request, data)
Затем, в моей функции обратного вызова jQuery $.post(...)
, я проверяю, имеет ли объект response
атрибут msg
, а затем вставляет содержимое response.msg
в DOM, где я хочу, чтобы он был, при необходимости переходы jQuery. Мой шаблон base.html
содержит контейнер <ul>
для сообщений:
<ul id="popup-messages-content">
{% include 'messages.html' %}
</ul>
Обратите внимание, что приведенное выше включает в себя messages.html
для случая, когда вы хотите отображать сообщения при фактической загрузке страницы (не-AJAX-запрос) - он пуст, если сообщений нет, но <ul>
по-прежнему доступен для ввода сообщений, полученных AJAX.
Последняя часть - это функция Javascript (требуется jQuery), которую я использую в любых обратных вызовах $.post(...)
для отображения сообщений:
function showPopupMessage(content) {
var elMessages = $('#popup-messages-content');
if (elMessages.length && content) {
elMessages.html(content);
}
}
Ответ 2
Я нашел более простой способ сделать это здесь, я взял некоторые из этих идей, и это было моим результатом:
Вы просто создаете свои сообщения, как всегда, и перед отправкой ответа вы помещаете их в список dicts:
django_messages = []
for message in messages.get_messages(request):
django_messages.append({
"level": message.level,
"message": message.message,
"extra_tags": message.tags,
})
Затем вы добавляете любые данные и свои сообщения и сериализуете их, например:
data = {}
data['success'] = success
data['messages'] = django_messages
return HttpResponse(simplejson.dumps(data), content_type="application/json")
Наконец, на вашем ajax:
success: function(data){
success = data.success;
update_messages(data.messages);
if (success){
...
}
},
И функция update_messages:
function update_messages(messages){
$("#div_messages").html("");
$.each(messages, function (i, m) {
$("#div_messages").append("<div class='alert alert-"+m.level+"''>"+m.message+"</div>");
});
}
Он отлично работает, и мне было очень легко реализовать
Ответ 3
Вот простая идея.
Добавьте местозаполнитель для ваших сообщений в layout.html, это позволяет добавлять новые сообщения в javascript:
<div id="messages">
{% for message in messages %}
<div id="notice" align="center">
{{ message }}
</div>
{% endfor %}
</div>
Вместо:
{% for message in messages %}
<div id="notice" align="center">
{{ message }}
</div>
{% endfor %}
В add.html добавьте еще один, например:
{% if messages %}
<ul class="hidden-messages" style="display:none">
{% for message in messages %}
<div id="notice" align="center">
{{ message }}
</div>
{% endfor %}
</ul>
{% endif %}
И ajaxForm будет выглядеть так:
$('#your_form_id').ajaxForm({
success: function(responseText) {
var newMessages = $(responseText).find('.hidden-messages').html();
$('#messages').append(newMessages);
},
});