如何根据链接到用户的模型(而不是基于用户的组)设置Django权限?

时间:2016-02-29 23:07:24

标签: django django-models django-permissions

我必须建立一个系统,允许用户根据初始调查是否被接受逐步填写调查。

这意味着在用户登录后,他们需要能够填写初步调查以进行筛选。只有在行政用户(超级用户)批准此初步筛选调查后,用户才能访问第二次(和最终)调查。

我有一个调查模型,如下所示:

class Screening_survey(models.Model):
    user = models.ForeignKey(User)
    name = models.CharField(max_length=20)
    surname = models.Charfield(max_length=20)
    salary = models.IntegerField()
    is_accepted = models.NullBooleanField()

当用户发布此初始调查时,他们只会填写姓名,姓氏和工资字段。最初发布调查时,“user”设置为当前登录用户(request.user),is_accepted在后台自动设置为“unknown”。然后由管理超级用户将is_accepted值更改为“yes”或“no”。

如果特定用户表单的is_accepted字段的值设置为yes,那么该用户应该能够访问下一个调查。

我已经查看了Django权限,但我认为默认权限对我来说并不适用,因为我不希望特定/ group /的用户访问特定页面;相反,我希望获得初步调查的用户可以访问下一个视图(最终调查)。

我还给了@user_passes_test装饰器一些想法,但似乎它只是在用户的基础上检查权限,而不是基于用户和链接到它们的模型。

我知道这个问题看起来很简单 - 我对Django以及一般的编程都很新。)

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您的位置 - 您需要定义自己的逻辑,以查看用户是否已获得批准,而不是权限。权限实际上不允许您按照每个用户或每个模型进行测试。

有两个地方可以定义此测试的位置。在视图本身中,或通过您自己的@user_passes_test装饰器。您已经拥有用户对象的外键,因此您可以在视图中编写测试,如下所示:

@login_required
def survey_view(request):
    survey = Screening_survey.objects.filter(user=request.user)
    if survey and survey.is_accepted is 'yes':
        # Do the remaining view logic
    else:
        raise PermissionDenied

如果你想把这个逻辑放在@user_passes_test中,那也可以。用户对象直接传递(有关示例,请参阅docs