Общие представления и аутентификация на основе классов Django - PullRequest
7 голосов
/ 08 июля 2011

Я довольно новичок в Django (начиная с 1.3).Создавая приложение, я пошел с новыми базовыми представлениями на основе классов с первого дня, используя комбинацию встроенных классов и подклассов их там, где мне нужно было добавить в контекст.

Теперь моя проблема в том,Мне нужно вернуться к своим представлениям, чтобы они были доступны только зарегистрированным пользователям.ВСЕ документация, которую я нашел, показывает, как это сделать со старыми функциональными универсальными представлениями, но не с классами на основе.

Вот пример класса:

class ListDetailView(DetailView):
    context_object_name = "list"

    def get_queryset(self):
        list = get_object_or_404(List, id__iexact=self.kwargs['pk'])
        return List.objects.all()

    def get_context_data(self, **kwargs):
        context = super(ListDetailView, self).get_context_data(**kwargs)
        context['subscriber_list'] = Subscriber.objects.filter(lists=self.kwargs['pk'])
        return context

Как добавитьаутентификация для новых представлений на основе классов в Django?

Ответы [ 3 ]

19 голосов
/ 24 апреля 2012

Существует также опция аутентификации, из которой вы могли бы получить класс представления. Таким образом, используя этот миксин от brack3t.com :

class LoginRequiredMixin(object):

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(LoginRequiredMixin, self).dispatch(*args, **kwargs)

затем вы можете создать новые представления "требуется проверка подлинности", например:

from django.views.generic import DetailView

class MyDetailView(LoginRequiredMixin, DetailView):
    ....

без дополнительных дополнений. Очень похоже на то, что ты не повторяешься.

6 голосов
/ 08 июля 2011

В документах есть раздел, посвященный украшению представлений на основе классов - если вы просто хотите использовать старый login_required и т. Д., Это путь.

4 голосов
/ 30 марта 2012

Я описываю метод для декорирования любого ListView:

class MyListView(ListView):
    decorator = lambda x: x

    @method_decorator(decorator)
    def dispatch(self, request, *args, **kwargs):
       return super(MyListView, self).dispatch(request, *args, **kwargs)

После написания представления на основе классов, подобного этому, вы можете непосредственно вставить любой URL-адрес на основе функции в URL следующим образом.

url(r'^myurl/$', MyListView.as_view(decorator=login_required))
...