根据与当前登录用户相关的用户配置文件,仅显示 django admin 上的那些对象
Display only those objects on django admin based on the user profile which is related to user that has logged in currenty
我想要一个管理员,任何登录管理仪表板的操作员都只能查看他们的包对象,而不是 see/change 其他操作员(来自用户)添加的包对象。
我的模特:
class Package(models.Model):
operator = models.ForeignKey(UserProfile, on_delete=models.CASCADE)
destination = models.ForeignKey(Destination, on_delete=models.CASCADE)
package_name = models.CharField(max_length=255)
city = models.CharField(max_length=255)
class UserProfile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL,
related_name='profile', on_delete=models.CASCADE)
group = models.ForeignKey(Group, on_delete=models.CASCADE)
user_type = models.CharField(max_length=1, choices=USER_TYPES, default='g')
first_name = models.CharField(max_length=255, default="")
我的package/admin.py:
class PackageAdmin(ModelAdmin):
icon_name = 'explore'
autocomplete_fields = ['destination']
list_display = ('image_display','package_name', 'featured', 'price', 'discounted_price',
'savings', 'fix_departure', 'rating',
'date_created',)
image_display = AdminThumbnail(image_field='thumbnail')
image_display.short_description = 'Image'
readonly_fields = ['image_display']
def get_queryset(self, request):
abc = super(PackageAdmin, self).get_queryset(request)
if request.user.is_superuser:
return abc
else:
operator = request.user.id
return abc.filter(operator=operator)
我已经覆盖了 get_queryset(self, request) 函数,但它不起作用。
我的更新:
我在这里看到另一个问题。现在,虽然操作员不能 see/modify 另一个对象,但可以使用下拉列表中的电子邮件在另一个操作员名称上添加包对象。
两个解决方案是:
- 只有当前 user/profile 在运算符字段中可见。
- 虽然邮箱可见,但无法将包裹添加到其他运营商的邮箱下。
Package.operator
是 ForeignKey
到 UserProfile
模型,您需要使用 [=15= 将此模型的实例传递给具有 request.user.profile
的过滤器] 来自 OneToOneField
def get_queryset(self, request):
queryset = super(PackageAdmin, self).get_queryset(request)
if request.user.is_superuser:
return abc
else:
operator = request.user.profile
return queryset.filter(operator=operator)
我想要一个管理员,任何登录管理仪表板的操作员都只能查看他们的包对象,而不是 see/change 其他操作员(来自用户)添加的包对象。
我的模特:
class Package(models.Model):
operator = models.ForeignKey(UserProfile, on_delete=models.CASCADE)
destination = models.ForeignKey(Destination, on_delete=models.CASCADE)
package_name = models.CharField(max_length=255)
city = models.CharField(max_length=255)
class UserProfile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL,
related_name='profile', on_delete=models.CASCADE)
group = models.ForeignKey(Group, on_delete=models.CASCADE)
user_type = models.CharField(max_length=1, choices=USER_TYPES, default='g')
first_name = models.CharField(max_length=255, default="")
我的package/admin.py:
class PackageAdmin(ModelAdmin):
icon_name = 'explore'
autocomplete_fields = ['destination']
list_display = ('image_display','package_name', 'featured', 'price', 'discounted_price',
'savings', 'fix_departure', 'rating',
'date_created',)
image_display = AdminThumbnail(image_field='thumbnail')
image_display.short_description = 'Image'
readonly_fields = ['image_display']
def get_queryset(self, request):
abc = super(PackageAdmin, self).get_queryset(request)
if request.user.is_superuser:
return abc
else:
operator = request.user.id
return abc.filter(operator=operator)
我已经覆盖了 get_queryset(self, request) 函数,但它不起作用。
我的更新:
我在这里看到另一个问题。现在,虽然操作员不能 see/modify 另一个对象,但可以使用下拉列表中的电子邮件在另一个操作员名称上添加包对象。
两个解决方案是:
- 只有当前 user/profile 在运算符字段中可见。
- 虽然邮箱可见,但无法将包裹添加到其他运营商的邮箱下。
Package.operator
是 ForeignKey
到 UserProfile
模型,您需要使用 [=15= 将此模型的实例传递给具有 request.user.profile
的过滤器] 来自 OneToOneField
def get_queryset(self, request):
queryset = super(PackageAdmin, self).get_queryset(request)
if request.user.is_superuser:
return abc
else:
operator = request.user.profile
return queryset.filter(operator=operator)