Django:用ajax加载“base”模板的内容

时间:2013-11-25 20:29:13

标签: jquery ajax django

点击通知图标后,我想在基本模板中加载通知。 目前,我在自定义上下文处理器的帮助下获取通知。

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调用。

1 个答案:

答案 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请求。