您如何根据链接到用户的模型(而不是基于用户组)设置 Django 权限?
How do you set Django permissions based on models linked to a user (and not based on a user's group)?
我必须制作一个系统,允许用户根据初始调查是否被接受来逐步填写调查。
这意味着用户登录后,他们需要能够填写初步调查以进行筛选。只有在管理用户(超级用户)批准此初步筛选调查后,用户才能访问第二个(也是最后一个)调查。
我有一个如下所示的调查模型:
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 字段的值设置为是,则该用户应该能够访问下一个调查。
我查看了 Django 权限,但我认为默认权限对我不起作用,因为我不希望特定 /group/ 的用户访问特定页面;相反,我希望初始调查已获批准的用户可以访问下一个视图(最终调查)。
我也对 @user_passes_test 装饰器进行了一些思考,但它似乎又一次检查了用户的权限,而不是基于用户和链接到他们的模型.
我知道这个问题看起来很简单——我对 Django 和一般编程都很陌生。
感谢您的帮助。
您说对了 - 您需要定义自己的逻辑来查看用户是否已获得批准,而不是权限。权限实际上并不允许您按照您正在寻找的方式在每个用户或每个模型的基础上进行测试。
有两个地方可以定义此测试的位置。在视图本身中,或通过您自己的 @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)
我必须制作一个系统,允许用户根据初始调查是否被接受来逐步填写调查。
这意味着用户登录后,他们需要能够填写初步调查以进行筛选。只有在管理用户(超级用户)批准此初步筛选调查后,用户才能访问第二个(也是最后一个)调查。
我有一个如下所示的调查模型:
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 字段的值设置为是,则该用户应该能够访问下一个调查。
我查看了 Django 权限,但我认为默认权限对我不起作用,因为我不希望特定 /group/ 的用户访问特定页面;相反,我希望初始调查已获批准的用户可以访问下一个视图(最终调查)。
我也对 @user_passes_test 装饰器进行了一些思考,但它似乎又一次检查了用户的权限,而不是基于用户和链接到他们的模型.
我知道这个问题看起来很简单——我对 Django 和一般编程都很陌生。
感谢您的帮助。
您说对了 - 您需要定义自己的逻辑来查看用户是否已获得批准,而不是权限。权限实际上并不允许您按照您正在寻找的方式在每个用户或每个模型的基础上进行测试。
有两个地方可以定义此测试的位置。在视图本身中,或通过您自己的 @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)