django - 在管理员的内联表单中限制选择中的外键选择

标签 django foreign-keys inline limit admin

模型的逻辑是:

  • A Building有很多Rooms
  • A Room可能在另一个里面 Room (例如,壁橱——“self”上的 ForeignKey)
  • A Room只能在另一个Room里面在同一栋楼里(这是棘手的部分)

这是我的代码:

#spaces/models.py
from django.db import models    

class Building(models.Model):
    name=models.CharField(max_length=32)
    def __unicode__(self):
        return self.name

class Room(models.Model):
    number=models.CharField(max_length=8)
    building=models.ForeignKey(Building)
    inside_room=models.ForeignKey('self',blank=True,null=True)
    def __unicode__(self):
        return self.number

和:

#spaces/admin.py
from ex.spaces.models import Building, Room
from django.contrib import admin

class RoomAdmin(admin.ModelAdmin):
    pass

class RoomInline(admin.TabularInline):
    model = Room
    extra = 2

class BuildingAdmin(admin.ModelAdmin):
    inlines=[RoomInline]

admin.site.register(Building, BuildingAdmin)
admin.site.register(Room)

内联将仅显示当前建筑物中的房间(这正是我想要的)。但是,问题在于 inside_room下拉,它会显示 Rooms 表中的所有房间(包括其他建筑物中的房间)。

rooms 的内联中, 我需要限制 inside_room选择只有rooms在当前building (建筑记录目前正在被主 BuildingAdmin 表格更改)。

我想不出用 limit_choices_to 来做到这一点的方法在模型中,我也不知道如何正确地覆盖管理员的内联表单集(我觉得我应该以某种方式创建自定义内联表单,将主表单的 building_id 传递给自定义内联,然后限制查询集field 的选择基于此——但我就是不知道该怎么做)。

也许这对于管理站点来说太复杂了,但它似乎通常是有用的......

最佳答案

使用请求实例作为 obj 的临时容器。 重写的内联方法 formfield_for_foreignkey修改查询集。 这至少适用于 django 1.2.3。

class RoomInline(admin.TabularInline):

    model = Room

    def formfield_for_foreignkey(self, db_field, request=None, **kwargs):

        field = super(RoomInline, self).formfield_for_foreignkey(db_field, request, **kwargs)

        if db_field.name == 'inside_room':
            if request._obj_ is not None:
                field.queryset = field.queryset.filter(building__exact = request._obj_)  
            else:
                field.queryset = field.queryset.none()

        return field



class BuildingAdmin(admin.ModelAdmin):

    inlines = (RoomInline,)

    def get_form(self, request, obj=None, **kwargs):
        # just save obj reference for future processing in Inline
        request._obj_ = obj
        return super(BuildingAdmin, self).get_form(request, obj, **kwargs)

关于django - 在管理员的内联表单中限制选择中的外键选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1824267/

相关文章:

mysql - 如何从 auth_user 表中按 django 中的 date_joined 顺序获取我之后的所有用户记录 [已关闭]

python - 在此服务器上找不到请求的 URL django

python - dateutil.parser.parse() 和丢失的时区信息

python - 为什么 web2py 没有更容易被采用?

nhibernate - 如何使用 NHibernate 持久化枚举

c++ - const vs非const内联变量

c++ - 如何告诉编译器不要内联类定义中定义的方法,under/ob1 优化?

mysql - mysql无法创建外键

mysql - 如何修复创建外部约束时的索引错误

css - 将文本放入容器并在必要时换行 css