python-3.x - 如何使用扩展用户模型类实现 django admin 查询集过滤器
问题描述
我已经使用以下模型扩展了 Django 默认用户模型(只是为了保存用户 state_id)类。
class UserProfileInfo(models.Model):
user = models.OneToOneField(User,on_delete=models.CASCADE,)
state_id = models.IntegerField(blank=False)
def __str__(self):
return self.user.username
现在我想按登录用户的state_id
. 我试图实现查询集过滤器,但它什么也没做。
class VisVisitsAdmin(admin.ModelAdmin):
list_per_page = 10
list_display = ('visit_id','visit_no','user_name','mobile_number','program_name','state_name','district_name','block_name','school_name',)
list_filter = ('date_of_visit',)
def queryset(self, request):
qs = super(VisVisitsAdmin, self).get_queryset(request)
if request.user.is_superuser:
return qs
return qs.filter(state_id=request.user.UserProfileInfo.state_id)
def state_name(self, obj):
if obj.school_program:
return obj.school_program.school.cluster.block.district.state.name_of_state
state_name.short_description = 'state name'
解决方案
您正在尝试从与用户对象相关的 userprofileinfo 实例中获取 state_id。
一切似乎都很好,但实例可用userprofileinfo
和不可用UserProfileInfo
,因此将 qs 更改为:
qs.filter(state_id=request.user.userprofileinfo.state_id)
推荐阅读
- android - 为什么 getJSONObject() 方法的源代码是“隐藏的”?
- c# - WinSCP - 将文件从 Windows 机器上传到 Linux - 错误:时间跨度溢出,因为持续时间太长
- c# - 在 foreach 循环中使用 List.FindAll 返回的 List<> 与使用本地 List 的区别?
- python - ModuleNotFoundError:没有名为“tensorflow”的模块 Windows 10
- mysql - 如何避免 mysql 存储过程中的 IN (Select...) 子查询
- c# - 从 textBox.Text 跳转到另一个 textBox.Text
- swift - 如何在另一个 UIViewController 中显示使用 Firebase 登录的用户的名称
- c# - 在 windows 窗体应用程序中刷新数据
- android - 应用程序因发布 apk 崩溃 [Android Studio]
- java - 如何在@InitBinder 验证之前执行代码