Django 管理后台选择排序与默认模型排序不同

8 投票
3 回答
1318 浏览
提问于 2025-04-17 10:34

我有一个模型(节点),在后台管理时是按日期排序的,所以最新的节点会排在最前面。这没问题。

同样的模型(节点)被另一个模型(设备)引用。当我编辑设备时,会有一个节点的列表(在一个HTML选择框中),这个列表也是按日期排序的。

我希望这个选择框能按名称排序,而不是按日期。

有没有办法让这两种排序方式不同,一个用于对象列表,一个用于选择框呢?

谢谢。

3 个回答

0

你可以为设备管理员创建一个自定义表单,并为“节点”字段设置查询集参数。

# in models.py we have Device model with Node field
class Device(models.Model):
    node = models.ForeignKey(Node)
    ...

# in admin.py we have DeviceAdmin with custom form
class DeviceAdminForm(forms.ModelForm):
    node = forms.ModelChoiceField(queryset=Node.objects.order_by('name'), label='Node')

    class Meta:
        model = Device

class DeviceAdmin(admin.ModelAdmin):
    form = DeviceAdminForm
2

你有没有试过类似这样的代码:

class Node
        name = ...
        date = ...
        fields ....

        class Meta:
            order_with_respect_to='Device'
            ordering = ('Device', 'name')
6

最简单的方法就是在DeviceModelAdmin中重写一下formfield_for_foreignkey这个方法,像这样:

def formfield_for_foreignkey(self, db_field, request, **kwargs):
    if db_field.name == 'node':
        kwargs['queryset'] = Node.objects.order_by('name')
    return super(DeviceAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)

(我这里假设了很多,希望能让你明白!)

类似的还有formfield_for_manytomany

撰写回答