django字母管理命令
我使用的是django管理员,我有一个如下的模型。它在管理中显示为下拉列表。我怎样才能按字母表订购?而不是默认的用户IDdjango字母管理命令,django,django-models,django-admin,Django,Django Models,Django Admin,我使用的是django管理员,我有一个如下的模型。它在管理中显示为下拉列表。我怎样才能按字母表订购?而不是默认的用户ID user= models.ForeignKey(User) 根据Django core开发人员的说法,您描述的问题是一个特性,而不是bug。起初,Django按字母顺序排列User字段,但这导致了拥有数十万用户的大型站点(即当时)的性能问题。但是,与要求少数大型Django网站实施解决方案不同,订购过程非常简单,现在每个网站都有一个可用性问题,即带有ForeignKeyto
user= models.ForeignKey(User)
根据Django core开发人员的说法,您描述的问题是一个特性,而不是bug。起初,Django按字母顺序排列
User
字段,但这导致了拥有数十万用户的大型站点(即当时)的性能问题。但是,与要求少数大型Django网站实施解决方案不同,订购过程非常简单,现在每个网站都有一个可用性问题,即带有ForeignKey
toUser
的模型
大约一年前,我在Django问题追踪网站上发布了一篇文章。Daniel Roseman在另一个网站上发布了一个类似(而且更好)的解决方案。为您的模型创建一个自定义表单,并将其分配给您的ModelAdmin子类——您可以覆盖表单的
\uuuu init\uuuu
中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提供了更好的方法。甚至在他们的文档中
为什么不在模型级别
class Meta:
ordering = ['field',]
还是在管理层
class Admin:
ordering = ('field',)
如果您不仅有5个用户,而且有相当数量的用户,那么将管理员更改为使用
raw\u id\u字段
进行用户选择可能是有意义的。这样,用户将显示在他们自己的列表视图中,允许进行筛选和排序
class MyAdmin(ModelAdmin):
raw_id_fields = ['user']
您可以在
admin.py
相关的管理类中轻松排序
假设您的管理类如下所示:
@admin.register(UserStuff)
class UserStuffAdmin(admin.ModelAdmin):
list_display = ['user', 'other', 'fields']
ordering = ['user']
行ordering=['user']
将通过user
字段进行排序。根据字段的不同,按字母或数字顺序排列。使用字段的正常排序方法。您还可以执行排序=['-user']
,它将按降序排序
来源:你知道为什么我总是得到“类型对象‘CollaboratorForm’没有属性‘fields’”谢谢你知道类型对象‘CollaboratorForm’没有属性‘fields’只是因为它是django.contrib,所以你不应该这样更改它。可以,但这不是为单个项目修改库的好主意。对不起?我不是说修改任何库。我在考虑文档中所述的代理模型:“标准用户模型没有定义排序(故意;排序很昂贵,我们不想在获取用户时一直这样做)。在使用代理时,您可能希望定期按用户名属性排序…”但是,然后-您将在不同的名称空间中拥有不同的模型。因此,您的外键将指向不同的模型。是的,指向代理模型。够清楚了吗?不管怎么说,与你的第一句话无关,