Django 管理后台选择排序与默认模型排序不同
我有一个模型(节点),在后台管理时是按日期排序的,所以最新的节点会排在最前面。这没问题。
同样的模型(节点)被另一个模型(设备)引用。当我编辑设备时,会有一个节点的列表(在一个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
最简单的方法就是在Device
的ModelAdmin
中重写一下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
。