2011-02-25 52 views
1

我在Django管理application.I實現行級權限有我的三個車型分別是:如何自定義django admin中的表單值以僅顯示分配給他/她的那些值?

  1. - {名稱,代碼}

  2. 單位 - {標題,場(外鍵)}

  3. 主題 - {標題,單位(外鍵)}

注:(上面的粗體字是型號名稱和值在大括號中的詞語是現場每個型號)

每個用戶有權限添加/編輯/刪除分配給他/她的特別課程。我正在使用def queryset(self, request):方法來檢查哪個用戶具有哪些課程的權限,然後返回這些課程的查詢集。通過這種方式,我可以顯示分配給他/她的用戶特定課程。

A 當然可以有許多單位和一個單位可以有很多Topics.Its一個層次結構。

因此,我再次使用相同的def queryset(self, request):來過濾單位和主題,以僅顯示分配給他/她的課程單元和主題。直到現在一切順利,因爲用戶只能看到單元主題這些都與他/她的課程有關。但是,當用戶試圖編輯會出現一個表格的單位有兩個領域:

  1. 標題(單位稱號,他可以重命名)
  2. 當然(下拉的所有課程列表,從中他也可以選擇任何/外鍵)

在第二場「當然」下拉我只是希望用戶能夠看到只分配給他的課程/ her.so,他/她會無法與其他任何人更新單元沒有分配給他/她的課程。

同樣的情況與編輯主題,用戶可以在下拉字段中看到所有的單位,並可以選擇任何單位的主題。

我想我需要重寫一些視圖或做一些魔術,但無法找到答案。

回答

1

您應該覆蓋ModelAdmin中的formfield_for_foreignkey方法Unit以根據請求更改查詢集。喜歡的東西(未經測試):

class UnitAdmin(admin.ModelAdmin): 
    def formfield_for_foreignkey(self, db_field, request=None, **kwargs): 
     if db_field.name == 'course': 
      # filter queryset somehow based on request.user: 
      kwargs['queryset'] = db_field.rel.to._default_manager.filter(...) 
     return super(
      UnitAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs) 
+0

感謝好友。它的工作(我愛計算器) – Anshul 2011-02-26 07:34:57

1

您可以使用

從smart_selects。db_fields進口ChainedForeignKey

示例代碼

from django.db import models 
from smart_selects.db_fields import ChainedForeignKey 

class Continent(models.Model): 
    name = models.CharField(max_length=100) 
    def __unicode__(self): 
     return self.name 

class Country(models.Model): 
    name=models.CharField(max_length=100) 
    continent=models.ForeignKey(Continent) 
    def __unicode__(self): 
     return self.name 

class Area(models.Model): 
    name=models.CharField(max_length=100) 
    country=models.ForeignKey(Country) 
    def __unicode__(self): 
     return self.name 

class Location(models.Model): 
    continent = models.ForeignKey(Continent) 
    country = ChainedForeignKey(
     Country, 
     chained_field="continent", 
     chained_model_field="continent", 
     show_all=False, 
     auto_choose=True 
    ) 
    area = ChainedForeignKey(Area, chained_field="country", chained_model_field="country") 
    city = models.CharField(max_length=50) 
    street = models.CharField(max_length=100) 

    def get_products(self): 
     return ','.join([p.name for p in self.area.all()]) 
相關問題