【问题标题】:django admin - how to override the default <select> view for foreign key?django admin - 如何覆盖外键的默认 <select> 视图?
【发布时间】:2010-01-27 20:04:19
【问题描述】:

我有 2 个 django 模型

class Location
  address = models.CharField(max_length=100)
  city = models.CharField(max_length=20)

class Client
  location = models.ForeignKey(Location)
  name = models.CharField(max_length=100)

我有以下 admin.py

class ClientAdmin(admin.ModelAdmin):
fieldsets = [
    ('Client Details', {'fields': ['name']}),
    ('Location Details', {'fields': ['location']}),
]


admin.site.register(Client, ClientAdmin)

当我尝试添加客户时,我希望有一个可编辑的“位置”字段,即地址和城市文本字段。 django 默认提供一个列表.. 我怎样才能从表中获取字段?

有什么办法可以做到这一点?我不想在管理员中注册 Location 表。

谢谢

【问题讨论】:

    标签: django-admin


    【解决方案1】:

    您可以为该位置放置一个内联表,并使用方法 queryset 来处理字段值。 所以,这是解决方案的想法:

    class LocationInline(admin.StackedInline):
        model = Location
    
        def queryset(self, request):
            query = ... #your custom query here
            qs = super(LocationInline, self).queryset(request).filter(query)
            return qs
    
    
    class ClientAdmin(admin.ModelAdmin):
        inlines = [LocationInline]
        fieldsets = [
            ('Client Details', {'fields': ['name']}),
        ]
    

    编辑: 在 django 1.1 中还有另一种方法。

    class ClientAdmin(admin.ModelAdmin):
        fieldsets = [
            ('Client Details', {'fields': ['name']}),
            ('Location Details', {'fields': ['location']}),
        ]
    
    def formfield_for_foreignkey(self, db_field, request, **kwargs):
    
        if db_field.name = "location":
            locations = Location.objects.filter( ... ) #your query
    
            kwargs["queryset"] = Location.objects.filter(query)
    
        return super(ClientAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
    

    文档在这里:http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_for_foreignkey

    这是一个老问题,但回答这个问题也可以帮助很多其他人。 所以,我希望它有所帮助! ;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-28
      • 1970-01-01
      • 2012-09-03
      • 2019-07-23
      • 2017-01-26
      • 2012-06-27
      • 1970-01-01
      • 2020-05-04
      相关资源
      最近更新 更多