2012-03-05 80 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