Доступ к пользователю в общих представлениях на основе классов - PullRequest
3 голосов
/ 21 августа 2011

Я пытаюсь проверить, если user.is_authenticated() или user.has_perm(), но кажется невозможным расширить основанные на классах представления django. Единственный метод, который я нашел, когда появляется request, это get().

class MyDetailView(DetailView):
    def get(self, request, **kwargs):
        import pdb
        pdb.set_trace()
        self.object = self.get_object()
        context = self.get_context_data(object=self.object)
        return self.render_to_response(context)

там я обнаружил, что request.user является экземпляром AnonymusClass независимо от того, вошел я в систему или нет.

(Pdb) request.user.__class__
<class 'django.contrib.auth.models.AnonymousUser'>

, поэтому проверка подлинности или разрешений всегда будет неудачной:

(Pdb) self.request.user.is_authenticated()
False

Я пытался переопределить другие методы, такие как get_object(), get_context_data() и другие. У каждого из них есть атрибут self.request, но user по-прежнему Anonymus.

Итак, мой вопрос: Как же я должен проверять, вошел ли пользователь, используя представления на основе классов!?

Означает ли это, что я должен (вернуться и) использовать функциональные представления?

Я использую Python 2.7.1+ и Django version 1.4 pre-alpha SVN-16627




В ответ на сообщение EVIAAC: Использование login_required или permissions_required декораторов не вариант. Мне нужно проверить разрешения / вход в систему после получения объекта: если объект имеет логическое поле registration_required, установленное на True, только зарегистрированные пользователи смогут видеть страницу, другие будут перенаправлены на страницу входа (пример поведения заимствован у django.contrib.flatpages).

Ответы [ 3 ]

2 голосов
/ 21 августа 2011

Работает правильно в 1.3:

class TestView(DetailView):
    def get(self, request, **kwargs):
        import ipdb; ipdb.set_trace()

ipdb> request.user
<User: zk>
ipdb> request.user.is_authenticated()
True

Возможно, ошибка?

1 голос
/ 21 августа 2011

Попробуйте использовать декораторы из django.contrib.auth.decorators.В вашем urls.py вы можете сделать что-то вроде:

from django.contrib.auth.decorators import login_required

...
url(r'^something/?$', login_required(MyDetailView.as_view()))
...

Для проверки прав вы можете использовать декоратор premissions_required.Для получения дополнительной информации, проверьте документы: https://docs.djangoproject.com/en/dev/topics/auth/#the-login-required-decorator

0 голосов
/ 12 марта 2014

Я использую миксины для представлений на основе классов. В этом случае вы можете сделать это так:

Общие представления и аутентификация на основе классов Django

...