我正在使用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))
答案 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");
}