【问题标题】:Django 1.4 User Admin list_filter using UserProfile fieldDjango 1.4 User Admin list_filter 使用 UserProfile 字段
【发布时间】:2013-10-11 19:04:06
【问题描述】:

编辑:我更新了代码以反映查询集过滤器中的一个错误,其中我有 user__user_type,已被正确的 userprofile__user_type 替换。

我使用的是 Django 1.4,并且我知道有一个新功能可以为管理员创建自定义 list_filters,它取代了 FilterSpec API。

我已经阅读了无数关于创建自定义管理 list_filters 的 SO 帖子,但我仍然卡住了。

我的用例是我的用户对象的 list_filter 引用 UserProfile 模型中的字段。

所以在models.py中:

class UserProfile(models.Model):
    user = models.OneToOneField(User, unique=True)
    user_type = models.CharField(max_length=25, choices=USER_TYPES, default='Client')
    ...

在 admin.py 中:

from django.contrib import admin
from django.contrib.admin import site, ModelAdmin, ChoicesFieldListFilter
from django.contrib.auth.models import User
from django.contrib.auth.admin import UserAdmin
from models import UserProfile

class UserTypeFilter(ChoicesFieldListFilter):
    title = 'User Type'
    parameter_name = 'user_type'

    def lookups(self, request, model_admin):
        usertypes = set([c.user_type for c in UserProfile.objects.all()])
        return [(c.id, c.user_type) for c in usertypes]

    def queryset(self, request, queryset):
        if self.value():
            return queryset.filter(userprofile__user_type=self.value())
        else:
            return queryset

class UserAdmin(UserAdmin):
    list_filter = ('is_staff', UserTypeFilter)
    inlines = (UserProfileInline, )


admin.site.unregister(User)
admin.site.register(User, UserAdmin)

这是我得到的错误:

'UserAdmin.list_filter[1]' is 'UserTypeFilter' which is of type FieldListFilter but is not associated with a field name.

我最初尝试使用 SimpleListFilter,得到了这个错误

'unicode' object has no attribute 'id'

这是有道理的,因为我的 user_type 字段是一个选择字段,而选择是 unicode 对象。

文档显示了这个例子:

class PersonAdmin(UserAdmin):
    list_filter = ('company__name',)

但这似乎暗示“公司”是用户模型上的一个字段。我是否需要重新定义我的用户模型以包含用于 UserProfile 的 OneToOneField?还是我错过了一些明显的方式来引用用户的个人资料?

谢谢,

【问题讨论】:

    标签: django django-admin-filters


    【解决方案1】:

    您引用的第一个错误似乎特定于我从未使用过的FieldListFilter。我想它的重点是自动化与特定领域相关的东西。

    我认为您的示例没有任何用处,因为您提供了所有选项。

    我现在只使用SimpleListFilter...

    无论如何,您的错误是usertypes 是一组c.user_type,它是一个字符串。它没有id 属性。

    您需要返回[(c, c) for c in usertypes],其中第一个值是传递给您的QS的值,第二个是显示值。

    其余的不需要改变。

    【讨论】:

    • 我知道这个空间不应该是用来说“谢谢”的,但是你的回答太快了,太准确了,我还是这样做了。你摇滚。谢谢。
    • @AnthonyRoberts,没问题的人!问题很明确/模型 sn-p 是关键。
    猜你喜欢
    • 2011-01-16
    • 1970-01-01
    • 2018-03-05
    • 1970-01-01
    • 2013-05-15
    • 2021-09-03
    • 2012-03-30
    • 2012-04-06
    • 2010-12-09
    相关资源
    最近更新 更多