Django 1.2.x 中 ManyToMany 内联排序

3 投票
2 回答
842 浏览
提问于 2025-04-16 06:59

我正在使用Django 1.2的新功能ManyToMany admin.TabularInline来在管理应用中显示相关对象,这个功能很好用,但我不知道该把“ordering”属性设置成什么,这样才能根据一个交叉引用的字段名进行排序。

举个例子:

class Foo(models.Model):
    name = models.CharField(max_length=100)

class Bar(models.Model):
    title = models.CharField(max_length=100)
    foos = models.ManyToManyField(Foo)

class FooBarInline(admin.TabularInline):
    model = Bar.foos.through
    ordering = ('name', )  # DOES NOT WORK
    raw_id_fields = ('name', )  # THROWS EXCEPTION

class FooAdmin(admin.ModelAdmin):
    inlines = (FooBarInline, )

    class Meta:
        model = Foo

我该怎么才能访问到Foo.name字段,以便在这个内联中按它进行排序呢?

2 个回答

0

我觉得你可以重写一下

ModelAdmin.formfield_for_foreignkey(self, db_field, request, **kwargs)

你可以在这个文档里找到详细信息:ModelAdmin.formfield_for_foreignkey

3

模型中的 ordering元选项 用来指定内联元素的排列顺序。

class Foo(models.Model):
    name = models.CharField(max_length=100)

    class Meta:
        ordering = ('name',)

如果你想让管理界面中的模型排序和你主要的排序不同,可以这样做:

class Foo_Extended(Foo):
    class Meta:
        ordering = ('name',)

然后在你的AdminInline模型中使用Foo_Extended。

我猜你应该知道这一点,但Django 1.3给InlineAdmin模型增加了一个排序选项,不过我知道你提到的是Django 1.2。

撰写回答