我正在使用django-admin,我有一个模型如下。它显示为管理员中的下拉列表。我怎么能按字母顺序排序呢?而不是默认用户ID?
user= models.ForeignKey(User)
答案 0 :(得分:3)
根据Django核心开发人员的说法,你描述的问题是一个功能,而不是一个bug。在开始时,Django按字母顺序排序User
字段,但这导致真正大型网站(当时为Pownce)的性能问题,成千上万的用户。但是,不是要求少数巨大的 Django网站实施变通方法,而是排序只是removed,现在每个网站都有ForeignKey
到{{1}的模型有可用性问题。
大约一年前,我在Django问题跟踪器上发布了ugly workaround。 Daniel Roseman在另一个Stackoverflow question发布了一个类似的(和更好的恕我直言)解决方案。
答案 1 :(得分:0)
为模型创建自定义表单并将其分配给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)
答案 2 :(得分:0)
实际上,Django提供了更好的方法。它甚至在他们的文档中 http://docs.djangoproject.com/en/1.2/topics/db/models/#proxy-models
答案 3 :(得分:0)
为什么不在关卡模型?
class Meta:
ordering = ['field',]
或者在管理员级别?
class Admin:
ordering = ('field',)
答案 4 :(得分:0)
如果您不仅拥有5个用户,而且拥有相当数量的用户,则可以将管理员更改为使用raw_id_fields
进行用户选择。这样,用户将显示在他们自己的列表视图中,允许进行过滤和排序。
class MyAdmin(ModelAdmin):
raw_id_fields = ['user']
答案 5 :(得分:0)
您可以轻松地在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