У меня возникли проблемы с пониманием того, как работают новые CBV. Мой вопрос заключается в следующем: мне нужно требовать входа во все представления, а в некоторых из них - определенные разрешения. В функциональных представлениях я делаю это с помощью @permission_required () и атрибута login_required в представлении, но я не знаю, как это сделать в новых представлениях. Есть ли какой-то раздел в документации Django, объясняющий это? Я ничего не нашел. Что не так в моем коде?
Я пытался использовать @method_decorator, но он отвечает: « Ошибка TypeError в / Spaces / Prueba / _wrapped_view () принимает как минимум 1 аргумент (задано 0) »
Вот код (GPL):
from django.utils.decorators import method_decorator
from django.contrib.auth.decorators import login_required, permission_required
class ViewSpaceIndex(DetailView):
"""
Show the index page of a space. Get various extra contexts to get the
information for that space.
The get_object method searches in the user 'spaces' field if the current
space is allowed, if not, he is redirected to a 'nor allowed' page.
"""
context_object_name = 'get_place'
template_name = 'spaces/space_index.html'
@method_decorator(login_required)
def get_object(self):
space_name = self.kwargs['space_name']
for i in self.request.user.profile.spaces.all():
if i.url == space_name:
return get_object_or_404(Space, url = space_name)
self.template_name = 'not_allowed.html'
return get_object_or_404(Space, url = space_name)
# Get extra context data
def get_context_data(self, **kwargs):
context = super(ViewSpaceIndex, self).get_context_data(**kwargs)
place = get_object_or_404(Space, url=self.kwargs['space_name'])
context['entities'] = Entity.objects.filter(space=place.id)
context['documents'] = Document.objects.filter(space=place.id)
context['proposals'] = Proposal.objects.filter(space=place.id).order_by('-pub_date')
context['publication'] = Post.objects.filter(post_space=place.id).order_by('-post_pubdate')
return context
message
?Вот мой подход: я создаю миксины, которые защищены (они хранятся в моей библиотеке миксов):
Когда вы хотите, чтобы представление было защищено, просто добавьте соответствующий миксин:
Просто убедитесь, что ваш миксин первый.
Обновление: я опубликовал это в далеком 2011 году, начиная с версии 1.9 Django теперь включает этот и другие полезные миксины (AccessMixin, PermissionRequiredMixin, UserPassesTestMixin) в стандартной комплектации!
источник
Вот альтернатива с использованием декораторов на основе классов:
Это может быть использовано просто так:
источник
class_view_decorator(my_decorator(*args, **kwargs))
. Что касается условного сопоставления методов - вы можете изменить class_view_decorator, чтобы применить себя кView.get
илиView.post
вместоView.dispatch
.Я понимаю, что эта тема немного устарела, но все равно вот мои два цента.
со следующим кодом:
Теперь у нас есть способ исправления декоратора, чтобы он стал многофункциональным. Это фактически означает, что при применении к обычному представителю декорации, например, так:
этот декоратор все равно будет работать, если он использовался так, как он был изначально предназначен:
но также будет работать правильно, если используется так:
Похоже, что это хорошо работает в нескольких случаях, с которыми я недавно сталкивался, включая пример из реальной жизни:
Функция ajax_view написана для изменения представления (на основе функций), чтобы оно вызывало ошибку 404 всякий раз, когда это представление посещается вызовом без ajax. Просто применяя функцию исправления в качестве декоратора, этот декоратор также может работать в представлениях на основе классов.
источник
Для тех из вас , кто использует Django> = 1.9 , она уже включена в
django.contrib.auth.mixins
качествеAccessMixin
,LoginRequiredMixin
,PermissionRequiredMixin
иUserPassesTestMixin
.Таким образом, чтобы применить LoginRequired к CBV (например
DetailView
):Также хорошо иметь в виду порядок смешивания GCBV: Mixins должен идти с левой стороны, а базовый класс просмотра должен идти с правой стороны. Если порядок отличается, вы можете получить непредсказуемые результаты.
источник
Используйте брекеты Django. Он предоставляет много полезных миксинов, которые легко доступны. У него есть красивые документы. Попробуйте это.
Вы даже можете создавать свои собственные миксины.
http://django-braces.readthedocs.org/en/v1.4.0/
Пример кода:
источник
Если это сайт, на котором большинство страниц требует, чтобы пользователь вошел в систему, вы можете использовать промежуточное ПО для принудительного входа в систему во всех представлениях, кроме тех, которые особо отмечены.
Pre Django 1.10 middleware.py:
views.py:
Сторонние представления, которые вы не хотите переносить, могут быть исключены в настройках:
settings.py:
источник
В моем коде я написал этот адаптер для адаптации функций-членов к функции, не являющейся членом:
Вы можете просто использовать это так:
источник
method_decorator
есть). Кажется, хороший и читаемый способ достижения этого.Это очень легко с Django> 1,9 с поддержкой
PermissionRequiredMixin
иLoginRequiredMixin
Просто импортируй из аутентификации
views.py
Для более подробной информации читайте авторизацию в Django
источник
Прошло много времени, и теперь Джанго так сильно изменился.
Проверьте здесь, как украсить представление на основе классов.
https://docs.djangoproject.com/en/2.2/topics/class-based-views/intro/#decorating-the-class
Документация не включала пример «декораторы, которые принимают любой аргумент». Но декораторы, которые принимают аргументы, выглядят так:
поэтому, если мы хотим использовать mydec в качестве «обычного» декоратора без аргументов, мы можем сделать это:
Так же, чтобы использовать
permission_required
сmethod_decorator
мы можем сделать:
источник
Если вы делаете проект, который требует различных тестов разрешений, вы можете наследовать этот класс.
источник
Я сделал это на основе решения Джоша
Пример использования:
источник
Вот решение для allow_required decorator:
источник