Подтвердить что ты не робот

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))
4b9b3361

Ответ 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);
    },
});