django - 根据与当前登录的用户相关的用户配置文件,仅在 django admin 上显示那些对象
问题描述
我希望有一个管理员,任何登录管理仪表板的操作员只能查看他们的包对象,而不能查看/更改其他操作员(来自用户)添加的包对象。
我的模型:
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="")
我的包/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) 函数,但它不起作用。
我的更新:
我在这里看到另一个问题。现在,虽然操作员无法查看/修改其他对象,但可以使用下拉列表中的电子邮件将包对象添加到其他操作员名称上。
这两个解决方案将是:
- 只有当前用户/配置文件在操作员字段中可见。
- 尽管电子邮件可见,但无法在其他运营商的电子邮件下添加包裹。
解决方案
Package.operator
是模型ForeignKey
的UserProfile
一个实例,您需要request.user.profile
使用related_name
from将此模型的实例传递给过滤器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)
推荐阅读
- c# - 创建该类的对象时是否调用该类的主函数?
- r - 用“pivottabler”包中的字符替换缺失值
- javascript - 有没有办法像事件监听器一样在浏览器中查看 setInterval 行为?
- php - PECL PCSC 安装在 PHP 7.4 上
- javascript - 如何使每个条形图成为 D3 中的图像?
- java - Spring BOOT 中带有 REST 的 Angular
- cakephp - 在 Digitalocean 中找不到 CakePHP 目录
- vue.js - Ionic Vue:VueJsPaginate 未显示
- reactjs - 使用 material-ui react 创建具有可变卡片高度的网格
- python - TF Keras 在加载模型时如何获得预期的输入形状?