2012-03-05 81 views
4

我是新来的django。 我正在创建一个简单的应用程序,让用户输入一些数据并稍后查看。我只需要让django admin向用户显示她输入的数据和其他用户数据的非数据。 是否有可能将其更改为多个管理页面?通过登录用户筛选django管理员

谢谢

回答

12
  • 在模型中存储对用户的引用。

models.py:

from django.db import models 
from django.contrib.auth.models import User 

class MyModel(models.Model): 
    user = models.ForeignKey(User) 
    ... (your fields) ... 
  • 强迫当前用户将被存储在该字段中(使用管理员时)
  • 力这些对象的任何列表为(附加地)通过过滤当前用户(使用管理员时)
  • 防止其他用户进行编辑(即使他们无法看到列表中的对象,他们可以直接访问其change_form)

admin.py:

from django.contrib import admin 
from models import MyModel 

class FilterUserAdmin(admin.ModelAdmin): 
    def save_model(self, request, obj, form, change): 
     obj.user = request.user 
     obj.save() 

    def get_queryset(self, request): 
     # For Django < 1.6, override queryset instead of get_queryset 
     qs = super(FilterUserAdmin, self).get_queryset(request) 
     return qs.filter(created_by=request.user) 

    def has_change_permission(self, request, obj=None): 
     if not obj: 
      # the changelist itself 
      return True 
     return obj.user === request.user 

class MyModelAdmin(FilterUserAdmin): 
    pass # (replace this with anything else you need) 
admin.site.register(MyModel, MyModelAdmin) 

如果你有MyOtherModel与外键 “用户” 从FilterUserAdmin以同样的方式只子类MyOtherModelAdmin。

如果您希望某些超级用户能够看到任何东西,请根据您自己的要求相应地调整queryset()和has_change_permission()(例如,如果request.user.username =='me',请不要过滤/禁止编辑) 。 在这种情况下,您还应该调整save_model(),以便您的编辑不会设置用户,从而从前一个用户中“取走”该对象(例如,如果self.user为None(新实例),则只设置用户) 。

+1

我在'qs = super(self,FilterUserAdmin).queryset(request)'上收到一个错误。该错误是一个'TypeError',它说'必须是类型的,而不是MyModelAdmin'。 – Andy 2012-08-08 20:15:01

+0

尝试用'qs = admin.ModelAdmin.queryset(self,request)替换:'qs = super(self,FilterUserAdmin).queryset(request)'' – odedfos 2013-03-18 10:38:04

+0

@Andy'super()'将类放在'self ',所以'super(FilterUserAdmin,self)'是正确的方法。在Py3中,你可以完全省略args到'super()。 – 2017-05-03 09:13:21

1

你必须在用户保存到每一个项目,并与该用户作为搜索条件查询每个项目。你可能会建立一个你所有其他模型将继承的基础模型。为了让你开始看看row-level permissions in the admin