我将django-braces添加到系统中以确保只有某些用户才能执行某些操作。作为背景,我有一些用户登录并可能有其他用户与他们的帐户相关联,例如团队领导。
这些团队负责人可以编辑其团队的详细信息,以便我们在该修改视图中获得UserPassesTestMixin
,并在登录后在信息中心视图上获得LoginRequiredMixin
。
以下是我的观点;
class Dashboard(DetailView, LoginRequiredMixin):
template_name = 'online_entry/entrant/dashboard.html'
model = FreeCycleEntrant
http_method_names = ['get']
class UpdateEntrantWizard(SignupWizard, UserPassesTestMixin):
template_name = 'online_entry/entrant/wizard_form.html'
form_list = [EditTeamMember]
model = Entrant
instance = None
def get_instance_obj(self):
if self.instance is None and 'pk' in self.kwargs:
self.instance = get_object_or_404(
Entrant, pk=self.kwargs['pk']
)
return self.instance
def test_func(self, user):
parent = Entrant.objects.get(user=user)
return self.get_instance_obj().user_has_access(user, parent=parent)
我的Entrant
模型上的测试功能非常简单;
def user_has_access(self, user, parent=None):
"""
Indicates whether or not a user can edit this user. The passed in user
is the logged in user.
:type self: object
"""
if self.user == user:
return True
if isinstance(user, AnonymousUser):
return False
if parent and self.parent_entrant == parent:
return True
return False
因此,当我以其中一个用户身份登录时,从Dashboard
尝试转到UpdateEntrantWizard
视图后,我被重定向到/accounts/profile/
之前测试被击中(使用断点)。
我在执行大括号时遗漏了什么?看起来你真的只需要添加测试&混合使事情发挥作用。
答案 0 :(得分:1)
UserPassesTestMixin
inherits from AccessMixin
,其中包含login_url
属性。只需设置:
login_url = "/your_url/"
它会重定向到您选择的网址。
就测试而言,您可以使用django Client
。我的应用程序下面的例子应该在这里给出这个想法。显然,应该在省略号的位置创建此测试中的用户'Claire',并具有通过测试所需的权限。
def test_home_url_allows_authenticated_user(self):
c = Client()
...
c.login(username='Claire', password='pass')
content = c.get('/travel/')
self.assertEqual(content.status_code, 200)
最后,您可能希望在登录页面中添加以下这些信息:
{% if user.is_authenticated %}
<h2>You're logged in, but you might not have permission to view the page you requested.</h2>
{% else %}
...
因为如果用户没有正确的权限,用户将会在这里结束。
答案 1 :(得分:0)
尝试切换
class UpdateEntrantWizard(SignupWizard, UserPassesTestMixin):
要
class UpdateEntrantWizard(UserPassesTestMixin, SignupWizard):
使用以下内容时:
class SomeProtectedView(views.LoginRequiredMixin,
views.PermissionRequiredMixin,
TemplateView):
你调用mixins的顺序很重要。在此示例中,它将在检查权限之前检查用户是否已登录。而且,如果你首先放置TemplateView,它将完全绕过mixins。