2010-08-16 62 views
3

我正在使用django-admin,我有一个模型如下。它显示为管理员中的下拉列表。我怎样才能按字母顺序排列呢?而不是默认的用户ID?django管理员按字母顺序排列

user= models.ForeignKey(User) 

回答

3

根据Django核心开发人员的说法,您所描述的问题是一个功能,而不是一个错误。在开始时,Django按字母顺序排列User字段,但这导致真的大型网站(即当时的Pownce)的性能问题,成千上万的用户。但是,不要问几个巨大的 Django网站实施一个解决方法,排序只是removed,现在每个网站的模型与ForeignKeyUser有可用性的问题。

大约一年前,我在Django问题跟踪器上发布了ugly workaround。 Daniel Roseman在另一个Stackoverflow question中发布了类似的(和更好的)更好的解决方案。

+0

做你知道类型的对象“CollaboratorForm”有没有属性“域” – Grey 2010-08-17 21:13:23

+0

感谢我得到了它,我不应该使用注册 – Grey 2010-08-17 21:41:26

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) 
+0

做你知道为什么我总是得到“对象类型‘CollaboratorForm’有没有属性‘域’ “ 谢谢 – Grey 2010-08-17 21:12:37

+0

谢谢,我明白了,我不应该使用寄存器 – Grey 2010-08-17 21:42:30

0

为什么不在级别模型?

class Meta: 
    ordering = ['field',] 

或者在管理员级别?

class Admin: 
    ordering  = ('field',) 
+0

只是因为它是django.contrib,所以你不应该这样改变它。你可以但是这不是一个好主意来修改单个项目的库。 – Jerzyk 2011-03-22 12:10:31

+0

对不起?我不是在谈论修改任何图书馆。正如文档中所述,我正在考虑使用代理模型:“标准的用户模型没有定义它的排序(故意;排序是昂贵的,我们不想在我们获取用户时一直这样做)。当你使用代理时,可能希望通过用户名属性进行定期...“ – inigomedina 2011-03-23 15:26:12

+0

但是,然后 - 你将在不同的命名空间中使用不同的模型。所以你的外键将是一个不同的模型。 – Jerzyk 2011-03-23 15:52:42

0

如果你不仅5,但用户的像样的数目,它可能是有意义的更改管理员使用raw_id_fields用户选择。这样,用户将显示在他们自己的列表视图中,允许过滤和排序。

class MyAdmin(ModelAdmin): 
    raw_id_fields = ['user']