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 %} {{ message }} {% 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模板包含消息的

    容器:

      

    请注意,上面包含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); }, });