2011-02-25 51 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()]) 
相关问题