django支持UserPassesTestMixin重定向到' accounts / profile /'

时间:2015-06-26 16:26:16

标签: django permissions

我将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/之前测试被击中(使用断点)。

我在执行大括号时遗漏了什么?看起来你真的只需要添加测试&混合使事情发挥作用。

2 个答案:

答案 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。