2016-10-26 3 views
0

Я хочу, чтобы ограничить доступ к определенной точки зрения, так что принимаются только AJAX запросы, поэтому я реализовал следующий декоратор:Джанго: декоратор в основе зрения класса

def require_ajax(func): 
    def decorator(func): 
     def inner(request, *args, **kwargs): 
      if not request.is_ajax(): 
       return HttpResponseBadRequest() 
      return func(request, *args, **kwargs) 
     return inner 

    return decorator 

Это отлично работает в представлениях функций, но я не может понять, как использовать его в классах. Я пробовал this, но получил ошибки, полагаю, из-за старой версии Django, которую я использую.

И хорошо, мой класс, основанный на вид:

class AjaxView(TemplateView): 
    template_name = '...' 

    def get_context_data(self, **kwargs): 
    ... 
    return context 

    @method_decorator(require_ajax) 
    def dispatch(self, *args, **kwargs): 
     return super(AjaxView, self).dispatch(*args, **kwargs) 
+0

Какие ошибки в точности? Не может помочь вам, не зная проблемы. Использование метода method_decorator - это подход OK, однако вы можете проверить документацию для этой формы метода Django 1.4. https://django.readthedocs.io/en/1.4/topics/class-based-views.html?highlight=method_decorator#decorating-the-class – makaveli

+0

Вам нужно будет создать микширование для CBV - Точно так же 'login_required 'и' LoginRequiredMixin' работает – Sayse

+0

@makaveli ошибка только о kwargs, она говорит, что есть неожиданные kwargs (которые я использую в 'get_context_data'). – dabadaba

ответ

0

Реализация декоратор по-разному решается вопрос:

def require_ajax(func): 
    def decorator(request, *args, **kwargs): 
     if not request.is_ajax(): 
      return HttpResponseBadRequest() 
     return func(request, *args, **kwargs) 

    return decorator