我的Django项目中有3个简单的模型如下:
class Customer(models.Model):
name = models.CharField(max_length=250)
class Location(models.Model):
name = models.CharField(max_length=500)
customer = models.ForeignKey(Customer)
class CustomerLocation(models.Model):
name = models.CharField(max_length=250)
customer = models.ForeignKey(Customer)
location = models.ForeignKey(Location)
现在,我想在“管理员”面板中的location
中显示与Customer
关联的CustomerLocation
个列表。
例如,
Customer = C1, Location for C1 = L1, L2.
Customer = C2, Location for C2 = L3.
如果我选择C1
作为我的Customer
,我应该只能在L1, L2
中选择Location
。否则,它应该是空的。
如何在Django-Admin中实现此限制?
PS:我想通过models.Admin
实现此目的。
答案 0 :(得分:1)
有一个可插入的django应用程序:https://github.com/digi604/django-smart-selects
您只需添加一个字段:
location = ChainedForeignKey(
'Location',
chained_field='customer',
chained_model_field='customer',
auto_choose=True,
null=True,
blank=True,
)
(未经测试,但应该有效。)
在Django管理员中,如果您更改Customer
,Locations
会相应地更改列表。
UPD。嗯,似乎我没有理解你的问题。
您的Customer
模型中需要Location
字段为什么?据我所知,CustomerLocation
负责将这两个模型相互关联,因此每个Customer
可能会链接到多个Locations
。顺便说一句,你可以通过ManyToManyField
轻松实现这一目标。
为什么需要在CustomerLocation
显示客户和位置?您可能可以使用Django过滤器。例如:
class CustomerLocationAdmin(admin.ModelAdmin):
list_display = ('customer', 'location')
list_filter = ('location', 'customer')
admin.register(CustomerLocation, CustomerLocationAdmin)
然后,你得到:
此解决方案是否适合您?