Django – 如何在ajax函数下显示消息
我正在使用AjaxForm插件提交我的表单而不刷新。 喜欢:
$('#my_form_id').ajaxForm(function(){ //something on success or fail });
这工作正常。 当我点击提交按钮时,它保存表单数据而不刷新。 但在此之前; 我在我的模板文件上有django消息,如:
{% for message in messages %} {{ message }} {% endfor %}
如果post保存正确或出现故障,此代码的作用是显示通知。
现在; 我不能这样做。 我不明白我如何使用这些消息标签与ajaxfunction。
它只是保存post。 没有通知。
谢谢。
编辑:
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))
这些是帮助我解决问题的工具/方法。 首先,我有一个名为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 %}
当创建消息以响应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
模板包含消息的
容器:
{% include 'messages.html' %}
请注意,上面包含messages.html
用于在实际页面加载时显示消息的情况(非AJAX请求) – 如果没有消息则为空,但
仍可用于推送AJAX – 收到的消息。
最后一部分是我在任何$.post(...)
回调中使用的Javascript函数(需要jQuery)来显示消息:
function showPopupMessage(content) { var elMessages = $('#popup-messages-content'); if (elMessages.length && content) { elMessages.html(content); } }
我在这里找到了一种更简单的方法,我采取了一些想法,这是我的结果:
您只需像往常一样创建消息,然后在发送响应之前将其放入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(""+m.message+""); });
}
它工作得很好,我发现它很容易实现
这是一个简单的想法。
在layout.html中为您的邮件添加占位符,这样可以在javascript中添加新邮件:
{% for message in messages %} {{ message }} {% endfor %}
代替:
{% for message in messages %} {{ message }} {% endfor %}
在add.html中,添加另一个,例如:
{% if messages %}
{% endif %}
而ajaxForm看起来像:
$('#your_form_id').ajaxForm({ success: function(responseText) { var newMessages = $(responseText).find('.hidden-messages').html(); $('#messages').append(newMessages); }, });