我在理解新CBV的工作方式时遇到了一些麻烦。我的问题是,我需要在所有视图中登录,在某些视图中需要特定的权限。在基于函数的视图中,我使用@permission_required()和视图中的login_required属性来执行此操作,但是我不知道如何在新视图上执行此操作。django文档中是否有某些部分对此进行了解释?我什么都没找到 我的代码有什么问题?
我尝试使用@method_decorator
,但它回答“ / spaces / prueba / _wrapped_view()
处的TypeError至少接受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
CBV文档中列出了一些策略:
在你的urls.py
路线中添加装饰器,例如,login_required(ViewSpaceIndex.as_view(..))
dispatch
用以下方法装饰你的CBV 方法method_decorator
:
from django.utils.decorators import method_decorator
@method_decorator(login_required, name='dispatch')
class ViewSpaceIndex(TemplateView):
template_name = 'secret.html'
在Django 1.9之前,你不能method_decorator
在该类上使用它,因此你必须重写该dispatch
方法:
class ViewSpaceIndex(TemplateView):
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(ViewSpaceIndex, self).dispatch(*args, **kwargs)
使用Django 1.9+中提供的django.contrib.auth.mixins.LoginRequiredMixin这样的访问混合器,并在此处的其他答案中对此进行了概述:
from django.contrib.auth.mixins import LoginRequiredMixin
class MyView(LoginRequiredMixin, View):
login_url = '/login/'
redirect_field_name = 'redirect_to'
TypeError文档中解释了你获得a的原因:
注意:method_decorator将 args和* kwargs作为参数传递给类中经过修饰的方法。如果你的方法不接受一组兼容的参数,它将引发TypeError异常。
本文向大家介绍基于Python 装饰器装饰类中的方法实例,包括了基于Python 装饰器装饰类中的方法实例的使用技巧和注意事项,需要的朋友参考一下 title: Python 装饰器装饰类中的方法 comments: true date: 2017-04-17 20:44:31 tags: ['Python', 'Decorate'] category: ['Python'] --- 目前在中文网
Python 拥有一件非常有趣的特性,那就是函数装饰器。这个特性允许您使用一些 非常简介的语法编辑 Web 应用。因为 Flask 中的每个视图都是一个函数装饰器, 这些装饰器被用来将附加的功能注入到一个或者多个函数中。 route() 装饰器您可能已经使用过了。但是在一些情况下您需要实现自己的装饰器。例如, 您有一个仅供登陆后的用户访问的视图,如果未登录的用户试图访问,则把用户 转接到登陆界面。
问题内容: 我正在寻找有关其他人如何设计此方法的意见。我将提供基于类(Django组)的视图。 例如,用户组将确定他或她将有权访问哪些视图/模板。我正在考虑也许在表中存储用于查看功能的路径,以确定用户的链接栏将由什么组成。过滤器规范也可以存储,以确定哪些行将填充这些模板。 医院护理单位就是一个很好的例子。一个单位的护士不必看整个医院的病人。他们只需要去看病人。同一部门的医生也只需要看望那些患者,但
问题内容: 主视图是一个简单的分页ListView,我想向其中添加搜索表单。 我认为这样可以解决问题: 但是显然我错了..我在官方文档中找不到该怎么做的方法。 建议? 问题答案: 这些答案对引导我朝正确的方向大有帮助。谢谢大家 对于我的实现,我需要一个窗体视图,该窗体视图同时在get和post上返回ListView。我不喜欢重复get函数的内容,但需要进行一些更改。现在,self.form也可以从
问题内容: 我希望该帖子确实被csrf停止了,但是它返回403错误。 但是,如果删除该装饰器并在URLConf中执行此操作 它会工作。 这里发生了什么?它不应该工作,因为我猜那是method_decorator所做的。我正在使用python3.4和django1.7.1 任何建议都很好。 问题答案: 你需要装饰工作方法。它所做的是将视图函数本身的属性设置为,然后中间件在(最外面的)视图函数中对此进
问题内容: 我有一个带有几个视图的django应用程序,这些视图通过POST请求接受json对象。json对象是中等复杂的,具有几层嵌套,因此我正在使用json库解析raw_post_data,如下所示: 接下来,我要为这些视图编写测试。不幸的是,我不知道如何将json对象传递给客户端。这是我的代码的最简单的版本: 当我运行测试时,它失败并显示: 如何在Client.post方法中传递JSON对象