Django - 如何在ajax函数下显示消息

时间:2012-11-06 18:10:34

标签: django jquery django-templates

我正在使用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(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))

4 个答案:

答案 0 :(得分:11)

这些是帮助我解决问题的工具/方法。首先,我有一个名为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字典中,然后使用我的{{1}字典1}}返回一个适当的回复:

render_to_json

然后,在我的jQuery def my_custom_view(request) # ... your view code data = { 'msg': render_to_string('messages.html', {}, RequestContext(request)), } return render_to_json(request, data) 回调函数中,我检查$.post(...)对象是否具有response属性,然后将msg的内容插入到我希望它需要的DOM,如果需要,可以使用jQuery转换。我的response.msg模板包含消息的base.html容器:

<ul>

请注意,如果您希望在实际页面加载(非AJAX请求)上显示消息,则上述内容包括<ul id="popup-messages-content"> {% include 'messages.html' %} </ul> - 如果没有消息,则为messages.html仍然可以将AJAX接收的消息推送到。

最后一部分是我在任何<ul>回调中使用的Javascript函数(需要jQuery)来显示消息:

$.post(...)

答案 1 :(得分:6)

我找到了一种更简单的方法here,我采取了一些想法,这是我的结果:

您只需像往常一样创建邮件,然后在发送回复之前将其放入词典列表中:

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>");
            });

}

它完美无缺,我发现很容易实现

答案 2 :(得分: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);
    },
});

答案 3 :(得分:0)

在模板中

<div id="ajax_message">
    {% if messages %}
        {% for message in messages %}
            <div class="alert alert-{{ message.tags }}  fade show">
                {{ message|safe }}
            </div>
        {% endfor %}
    {% endif %}
</div>

ajax_send启动功能后

$("#ajax_message").load("this_url #ajax_message");

function alert_message() {
    var pathname = window.location.pathname;
    $("#ajax_message").load(pathname+" #ajax_message");
}