点击通知图标后,我想在基本模板中加载通知。 目前,我在自定义上下文处理器的帮助下获取通知。
contex_processors.py:
def notifications(request):
if request.POST and request.is_ajax:
notify_obj = #some logic here
return {'notify_obj': notify_obj}
但点击按钮后,整个页面会刷新。我想将ajax实现到基本模板,以便只刷新通知部门。
我知道如何在其他模板中实现ajax,但不知道如何在基本模板中实现。
请帮助我,或告诉我是否需要采取其他方法。
修改: 添加base.html以获得更多说明。
<div id="notify-div">
<form id="notify-form" method="post">
<input type="submit" name="notify" value="Show notifications">
{% csrf_token %}
</form>
{% for notify in notify_obj %}
{{ notify.user.user_id.username }}, {{ notify.wish.wish_text }} - {{ notify.added }}
{% endfor %}
</div>
<script>
$(document).ready(function() {
$('#notify_form').submit(function() { // catch the form's submit event
$.ajax({ // create an AJAX call...
data: $(this).serialize(), // get the form data
type: $(this).attr('method'), // GET or POST
url: $(this).attr('action'), // the file to call
success: function(response) { // on success..
$('#notify_div').html(response); // update the DIV
}
});
return false;
});
});
</script>`
请注意我应该在这里使用JS来使其成为ajax调用。
答案 0 :(得分:1)
最近有同样的问题。通过Ajax更新基本模板可能需要对您的所有视图函数进行一些调整,即:
if request.is_ajax:
#obj is your desired dict response obj
return JsonResponse(obj)
但这可能是一种矫枉过正。为避免歧义,只需在所有视图函数中添加一个装饰器:
@ajax_processor(context_processor=your_context_processor)
并实现装饰器,如:
def ajax_processor(context_processor):
def decorator(func):
'''Process all AJAX requests with context_processors'''
@wraps(func)
def wrapper(request, *args, **kwargs):
if request.is_ajax():
return context_processor(request)
else:
#Decorator does nothing
return func(request, *args, **kwargs)
return wrapper
return decorator
这意味着你的所有Ajax请求都需要通过这个context_processor,这不是一个坏主意。但是如果你不希望,你可以限制“if”语句只传递你希望装饰器服务的确切Ajax请求。