2013-11-25 6 views
0

Я хочу загрузить уведомления в мой базовый шаблон после нажатия на значок уведомления. В настоящее время я получаю уведомления с помощью настраиваемого контекстного процессора.Django: загрузить содержимое шаблона «base» с помощью ajax

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

Почему это проблема в базовом шаблоне? Просто добавьте/загрузите в него соответствующий JavaScript. – freakish

+0

для этого я думаю, что мне нужно отобразить некоторый HTML-код в коде, возможно ли это в контексте процессора, если да, то скажите, как –

+0

Я не понимаю проблему. Вы должны как-то использовать базовый шаблон (или, скорее, шаблон на основе базового шаблона). Может быть, вы должны сказать нам, что именно вы делаете и чего именно вы пытаетесь достичь. – freakish

ответ

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, который вы хотите, чтобы декоратор работал.

Смежные вопросы