如何在django admin中自定义表单值,以仅显示分配给他/她的值?
我在django admin应用程序中实现了行级权限。我有三个模型,分别是:如何在django admin中自定义表单值,以仅显示分配给他/她的值?,django,django-models,django-admin,django-forms,Django,Django Models,Django Admin,Django Forms,我在django admin应用程序中实现了行级权限。我有三个模型,分别是: 课程--{标题,代码} 单元--{课程名称(外键)} 主题--{标题,单位(外键)} 注:(上面粗体字是模型名称,大括号中的值是每个模型的字段) 每个用户都有权添加/编辑/删除分配给他的特定课程。我正在使用def queryset(self,request):方法检查哪个用户对哪些课程有权限,然后返回包含这些课程的queryset。通过这种方式,我能够显示分配给他/她的用户特定课程 一门课程可以有许多单元,而且一个单元
def queryset(self,request):
方法检查哪个用户对哪些课程有权限,然后返回包含这些课程的queryset。通过这种方式,我能够显示分配给他/她的用户特定课程
一门课程可以有许多单元,而且一个单元可以有许多主题。这是一个层次结构
因此,我再次使用相同的def queryset(self,request):
筛选单元和主题,以仅显示分配给他/她的课程下的单元和主题。到目前为止,一切都很顺利,用户只能看到与他/她的课程相关的单元和主题。但当用户试图编辑单元时,会出现一个表单,其中包含两个字段:
我想我需要覆盖一些视图或做一些魔术,但找不到。您可能应该覆盖
ModelAdmin
中Unit
的formfield\u for\u foreignkey
方法,以便根据请求更改查询集。类似于(未经测试):
你可以用
示例代码
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()])
from smart_selects.db_fields import 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()])