【发布时间】:2010-08-16 20:33:24
【问题描述】:
我正在使用 django-admin,我有一个模型如下。它在管理员中显示为下拉列表。我怎样才能按字母排序?而不是默认用户 ID?
user= models.ForeignKey(User)
【问题讨论】:
标签: django django-models django-admin
我正在使用 django-admin,我有一个模型如下。它在管理员中显示为下拉列表。我怎样才能按字母排序?而不是默认用户 ID?
user= models.ForeignKey(User)
【问题讨论】:
标签: django django-models django-admin
根据 Django 核心开发人员的说法,您描述的问题是一个功能,而不是一个错误。一开始,Django 按字母顺序对User 字段进行排序,但这导致了真正 拥有数十万用户的大型网站(当时是Pownce)的性能问题。但是,与其要求少数巨大 Django 网站实施变通办法,不如简单地订购removed,现在每个具有ForeignKey 到User 的模型的网站都存在可用性问题。
大约一年前,我在 Django 问题跟踪器上发布了ugly workaround。 Daniel Roseman 在另一个 Stackoverflow question 中发布了一个类似(恕我直言更好)的解决方案。
【讨论】:
为什么不在关卡模型上?
class Meta:
ordering = ['field',]
还是管理员级别的?
class Admin:
ordering = ('field',)
【讨论】:
为您的模型创建一个自定义表单并将其分配给您的 ModelAdmin 子类——您可以在表单的 __init__ 中覆盖 ModelChoiceField 的排序。例如:
# models.py
from django.db import models
from django.contrib.auth.models import User
class MyModel(models.Model):
user = models.ForeignKey(User)
# Other model fields ...
# forms.py
from django import forms
from django.contrib.auth.models import User
from myapp.models import MyModel
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
def __init__(self, *args, **kwargs):
super(MyModelForm, self).__init__(*args, **kwargs)
self.fields['user'].queryset = User.objects.order_by('first_name', 'last_name')
# admin.py
from django.contrib import admin
from myapp.models import MyModel
from myapp.forms import MyModelForm
class MyModelAdmin(admin.ModelAdmin):
form = MyModelForm
# Other admin attributes ...
admin.site.register(MyModel, MyModelForm)
【讨论】:
实际上,Django 提供了更好的方法来做到这一点。甚至在他们的文档中 http://docs.djangoproject.com/en/1.2/topics/db/models/#proxy-models
【讨论】:
如果您不仅拥有 5 个用户,而且拥有相当数量的用户,则将管理员更改为使用 raw_id_fields 进行用户选择可能是有意义的。这样,用户将显示在他们自己的列表视图中,允许过滤和排序。
class MyAdmin(ModelAdmin):
raw_id_fields = ['user']
【讨论】:
您可以轻松地在您的admin.py 相关管理类中排序。
假设您的 Admin 类如下:
@admin.register(UserStuff)
class UserStuffAdmin(admin.ModelAdmin):
list_display = ['user', 'other', 'fields']
ordering = ['user']
ordering = ['user'] 行将按user 字段排序。按字母顺序或数字顺序,具体取决于字段。使用字段的正常排序方法。您也可以使用ordering = ['-user'],它会按降序排列。
来源: https://docs.djangoproject.com/en/3.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.ordering
【讨论】: