django-admin面板中的限制性选择

时间:2013-11-19 11:55:07

标签: python django django-models django-admin

我的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实现此目的。

1 个答案:

答案 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管理员中,如果您更改CustomerLocations会相应地更改列表。


UPD。嗯,似乎我没有理解你的问题。

  1. 您的Customer模型中需要Location字段为什么?据我所知,CustomerLocation负责将这两个模型相互关联,因此每个Customer可能会链接到多个Locations。顺便说一句,你可以通过ManyToManyField轻松实现这一目标。

  2. 为什么需要在CustomerLocation显示客户和位置?您可能可以使用Django过滤器。例如:

    class CustomerLocationAdmin(admin.ModelAdmin):
        list_display = ('customer', 'location')
        list_filter = ('location', 'customer')
    
    admin.register(CustomerLocation, CustomerLocationAdmin)
    
  3. 然后,你得到:

    1. 客户和地点列表
    2. 客户和位置的两个下拉菜单。您可以选择特定客户或特定位置来获取必要的数据。
    3. 此解决方案是否适合您?