min*_*der 6 django django-admin django-queryset changelist
假设我有一个网站,用户可以通过管理面板添加条目.每个用户都有自己负责的类别(每个类别都有一个通过ForeingKey/ManyToManyField分配的编辑器).
当用户添加条目时,我使用EntryAdmin来限制选择,如下所示:
class EntryAdmin(admin.ModelAdmin):
(...)
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == 'category':
if request.user.is_superuser:
kwargs['queryset'] = Category.objects.all()
else:
kwargs['queryset'] = Category.objects.filter(editors=request.user)
return db_field.formfield(**kwargs)
return super(EntryAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
Run Code Online (Sandbox Code Playgroud)
通过这种方式,我可以限制用户可以添加条目的类别,并且它可以完美运行.
现在棘手的部分:在条目更改列表/操作页面上,我只想显示属于当前用户类别的条目.我尝试使用此方法执行此操作:
def changelist_view(self, request, extra_context=None):
if not request.user.is_superuser:
self.queryset = self.queryset.filter(editors=request.user)
Run Code Online (Sandbox Code Playgroud)
但我得到这个错误:
AttributeError:'function'对象没有属性'filter'
这很奇怪,因为我认为它应该是一个典型的QuerySet.基本上这些方法没有很好的记录,挖掘大量的Django代码不是我最喜欢的运动.
任何想法如何实现我的目标?
Ala*_*air 14
queryset是一个ModelAdmin返回查询集的方法.你需要在EntryAdmin课堂上覆盖它.
def queryset(self, request):
qs = super(EntryAdmin, self).queryset(request)
if request.user.is_superuser:
return qs
else:
return qs.filter(editors=request.user)
Run Code Online (Sandbox Code Playgroud)
更改查询集将限制列表视图中显示的条目.您还需要覆盖has_change_permission以确保用户有权在单个对象编辑页面上编辑对象.有关详细信息,请参阅James Bennett的以下博客文章:
http://www.b-list.org/weblog/2008/dec/24/admin/
| 归档时间: |
|
| 查看次数: |
8457 次 |
| 最近记录: |